当前位置: 首页 > 知识库问答 >
问题:

为什么打印大型ArrayList时会出现奇怪字符

东方俊杰
2023-03-14

我下面的教程部分处理打印数组列表的元素。当处理小列表时,该程序完全按照我的预期运行。然而,当输入较大的数字时,字符串格式(我相信)会导致一些奇怪的结果。

我的代码如下:

public class Theatre {
    private final String theatreName;
    public List<Seat> seats = new ArrayList<>();

    public Theatre(String theatreName, int numRows, int seatsPerRow) {
        this.theatreName = theatreName;

        int lastRow = 'A' + (numRows -1);
        for (char row = 'A'; row <= lastRow; row++) {
            for(int seatNum = 1; seatNum <= seatsPerRow; seatNum++) {
                Seat seat = new Seat(row + String.format("%02d", seatNum));
                seats.add(seat);
            }
        }
    }

    public String getTheatreName() {
        return theatreName;
    }

    public boolean reserveSeat(String seatNumber) {
        int low = 0;
        int high = seats.size()-1;

        while(low <= high) {
            System.out.print(".");
            int mid = (low + high) /2;
            Seat midVal = seats.get(mid);
            int cmp = midVal.getSeatNumber().compareTo(seatNumber);

            if(cmp <0) {
                low = mid + 1;
            } else if(cmp > 0) {
                high = mid -1;
            } else {
                return seats.get(mid).reserve();
            }
        }

            System.out.println("There is no seat " + seatNumber);
            return false;


    }

    // for testing
    public void getSeats() {
        for(Seat seat : seats) {
            System.out.println(seat.getSeatNumber());
        }
    }

    public class Seat implements Comparable<Seat > {
        private final String seatNumber;
        private boolean reserved = false;

        public Seat(String seatNumber) {
            this.seatNumber = seatNumber;
        }

        public boolean reserve() {
            if(!this.reserved) {
                this.reserved = true;
                System.out.println("Seat " + seatNumber + " reserved");
                return true;
            } else {
                return false;
            }
        }

        public boolean cancel() {
            if(this.reserved) {
                this.reserved = false;
                System.out.println("Reservation of seat " + seatNumber + " cancelled");
                return true;
            } else {
                return false;
            }
        }

        public String getSeatNumber() {
            return seatNumber;
        }

        @Override
        public int compareTo(Seat seat) {
            // returns integer greater than 0 if greater than, less than if less than, 0 if equal
            return this.seatNumber.compareTo(seat.getSeatNumber());
        }
    }

使用主方法类:

public static void main(String[] args) {
        Theatre theatre = new Theatre("Olympian", 800, 12);
        List<Theatre.Seat> seatCopy = new ArrayList<>(theatre.seats); // shallow copy, contains references to all
                                                                        // elements of both lists, original and copy
        printList(seatCopy);


        seatCopy.get(1).reserve();
        if (theatre.reserveSeat("A02")) {
            System.out.println("Please pay for A02");
        } else {
            System.out.println("seat already reserved");
        }

        // see that they are clearly two separate array lists
        Collections.reverse(seatCopy);
        System.out.println("Printing seat copy");
        printList(seatCopy);
        System.out.println("Printing theatre.seats");
        printList(theatre.seats);
        System.out.println("Shuffling seatCopy");
        Collections.shuffle(seatCopy);
        printList(seatCopy);

    }

    public static void printList(List<Theatre.Seat> list) {
        for (Theatre.Seat seat : list) {
            System.out.print(" " + seat.getSeatNumber());
        }
        System.out.println();
        System.out.println("===============================");
    }

}

输出(我只引用了足够多的内容)是:

12 ͠11 ͠10 ͠09 ͠08 ͠07 ͠06 ͠05 ͠04 ͠03 ͠02 ͠01 ͟12 ͟
===============================
Printing theatre.seats
A01 A02 A03 A04 A05 A06 A07 A08 A09 A10
===============================
===============================
 Shuffling seatCopy
V07 Ý11 11 ű05 Ú02 ̄06 ̓01 ŕ12 ȣ03 Ǔ05 S07 

我知道我用完了字母字符,这一行的格式:

Seat seat = new Seat(row + String.format("%02d", seatNum));

仅用于处理“X###”格式的座位。

我想了解的是为什么会出现奇怪的字符(~"和'等)。)。显然,格式不合适。但是为什么它专门产生这个输出呢?

谢谢你的帮助,马克

共有1个答案

姬衡
2023-03-14

你自己说的。按字母顺序排列的字符快用完了。事实上,ASCII字符已经用完了。从这一行:

for (char row = 'A'; row <= lastRow; row++)

您要做的是从“A”开始行字母,然后在Unicode字符集上继续。因此,当超过26行时,你开始得到像~这样的符号,当有足够的行时,你完全离开ASCII,开始得到像Ý这样奇怪的行字母。

如果不想发生这种情况,则需要放弃for循环,并想出一种完全不同(且更复杂)的行标签分配方法。

 类似资料:
  • 题目描述 Java 数组扩容问题:实现动态的给数组添加元素效果,实现对数组扩容 原始数组 int[] arr = {1,2,3} 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4} 题目来源及自己的思路 定义 arr1 定义 arr2,比 arr1 的长度长 1 在 arr1 的长度内,把 arr1 的值赋值给 arr2 arr2 的最后一个位置赋值为 4,也就是要加入的数据 因为

  • 我正在尝试在第三个数组中打印第一个数组的第一个索引和第二个数组的最后一个索引。也尝试了不同的方法,但仍然失败。 我还尝试了这段代码:出来的是:第三个数组将是:[0,0,0,0,0,0] 有什么解决办法吗?我真的很感激你能提供的任何帮助。 结果:

  • 所以我在做一个定时器包装函数,但是我在尝试打印参数的时候不断地得到错误。 我的计时器功能看起来是这样的: 理想的情况下,它也会打印kwargs,但显然这是一个完全不同的问题,尽管我会非常感谢如果有人帮助我做这件事。所以当没有一个论点的时候,我的结果很好: 给出:使用参数1000执行dummy_fn,取:0.2128157615661621 但是,如果我重新定义dummy_fn以获取更多的参数并传递

  • 问题内容: 我遇到此行的问题(在下面评论): 输出。 但是,输出。 现在,我不明白为什么我得到这个结果: 问题答案: 您缺少一组括号: 在您的版本中,正在通过与进行比较,这不是您想要的。 通常,的优先级高于,这就是为什么将其评估为的原因。

  • 问题内容: 我有以下课程: 这是编译结果; 为什么我的输出中包含数字? 问题答案: 在第二种情况下,它将两个字符(G-71和o-111)的unicode码相加并打印总和。这是因为被视为数字类型,因此在这种情况下,运算符是通常的求和。

  • 我在使用FPDF库生成pdf文件时得到了这个输出。 %PDF-1.3.0 obj 我的代码: