【问题标题】:Java ArrayList missing first valueJava ArrayList 缺少第一个值
【发布时间】:2020-12-10 12:49:53
【问题描述】:

我正在从文本文件中获取数据并将其放入 ArrayList。但是文本文件的第一行没有被打印出来。

public static void secondMain() {
    BufferedReader reader;
    var lines = new ArrayList<String>();
    var rooms = new ArrayList<Room>();
    try {
        reader = new BufferedReader(new FileReader("rooms.txt"));
        String line = reader.readLine();
        while (line != null) {
            line = reader.readLine();
            lines.add(line);
        }
        
        reader.close();
        
        for (int i = 0; i < lines.size() - 1; i++) {
            String[] words = lines.get(i).split(" ");
            var room = new Room();
            room.RoomNumber = Integer.parseInt(words[0]);
            room.Type = (words[1]);
            room.Price = Double.parseDouble(words[2]);
            room.Bool1 = Boolean.parseBoolean(words[3]);
            room.Bool2 = Boolean.parseBoolean(words[4]);
            room.Availability = (words[5]);
            rooms.add(room);
            
        }



        for(int i = 0; i < rooms.size(); i++) {
            System.out.println(rooms.get(i).RoomNumber);
            System.out.println(rooms.get(i).Type);
            System.out.println(rooms.get(i).Price);
            System.out.println(rooms.get(i).Bool1);
            System.out.println(rooms.get(i).Bool2);
            System.out.println(rooms.get(i).Availability);
                            
        }

为图像道歉,这是我能弄清楚如何显示文本文件格式的唯一方法。

当前输出显示房间号 102 作为第一个房间,这显然是不正确的。

如果有人也可以帮助我弄清楚如何以与文本文件相同的方式格式化我的控制台输出,那也很棒。目前它在不同的行上显示每个单独的字符串/int等。

谢谢。

如果您需要更多信息,请尽管询问!

【问题讨论】:

    标签: java arrays arraylist


    【解决方案1】:

    这与ArrayList 无关。您可以通过将lines.add(line) 调用替换为System.out.println(line) 来重现该问题,并且您会看到输出中缺少第一行。在 while 循环之前查看您对 readLine() 的第一次调用。你测试这个值是非空的......这就是你用它做的所有(我的cmets):

    String line = reader.readLine(); // Read the value...
    while (line != null) {           // Test for it being non-null
        line = reader.readLine();    // Then ignore the value you've just tested,
                                     // by reading the next line.
        lines.add(line);
    }
    

    然后您再次致电readLine()。请注意,您的列表始终以 null 值结尾(除非它是读取的第一行),因为您的循环实际上是说“而我添加到列表中的最后一个条目不为空”。最简单的解决方法是交换循环中语句的顺序:

    String line = reader.readLine();
    while (line != null) {
        lines.add(line);
        line = reader.readLine();
    }
    

    现在您在检查下一行是否为非空之后立即添加一行,然后再读取下一行。

    【讨论】:

      【解决方案2】:

      问题出在这里:

      String line = reader.readLine(); // you read the first line
      while (line != null) {
          line = reader.readLine(); // read second line
          lines.add(line); // add second line
      }
      

      您阅读第一行,检查它是否不是null,然后立即阅读第二行,然后再将其添加到列表中。您需要做的就是切换顺序。

      String line = reader.readLine();
      while (line != null) {
          lines.add(line);
          line = reader.readLine();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        • 1970-01-01
        • 2013-12-30
        • 2012-01-03
        • 1970-01-01
        相关资源
        最近更新 更多