【问题标题】:Read inconsistent file to arraylist java将不一致的文件读取到arraylist java
【发布时间】:2021-10-11 01:35:25
【问题描述】:

我有一个包含以下数据的文件:

19387,73616,11/10/2021,7268,8271
81716,16381,11/10/2021,2736,3715,7362,837
75464,27315,11/10/2021,,3545,7645,460
  • 格式为:id1, id2, yyyy/mm/dd, price, id3。
  • 可以有多个 id3(有些行有更多数据)。

数据类型有:int、int、string、float、arraylist integer。所以在这里,我只想将 id3 读取为整数数组列表

到目前为止我的代码:

Public static void main(String[] args){

  //variables
  int id1;
  int id2;
  String date;
  float price;
  ArrayList<Integer> id3List = new ArrayList<>();

  //check if file exists
  try {
      //get file
      File myFile = new File (“fileName.txt“);

      //pass file object to create scanner object
      Scanner inputFile = new Scanner ("myFile").useDelimiter(",|\\r|\\n");
      
      //read lines from file and store into respective variables
      try {
        While (inputFile.hasNextInt){
          id1 = inputFile.nextInt();
          id2 = inputFile.nextInt();
          date = inputFile.next();
          price = inputFile.nextFloat();
          id3.add(inputFile.nextInt());

          inputFile.nextLine(); //consume a line 

      } catch(InputMismatchException e){
        System.out.println("Bad data in file.");
      }
       System.out.println(id3);

       inputFile.close(); //close file

  } catch(FileNotFoundException e) {
     System.out.println("The file was not found.");
    }
}

我得到的结果只显示第一个 id3 而忽略其余的:

[8271, 3715, 7645]

注意:我只会为此使用扫描仪,而不是缓冲阅读器。

【问题讨论】:

  • 你只想使用扫描仪有什么原因吗?

标签: java arraylist readfile


【解决方案1】:

我要做的第一件事是将文件解析与文本解析分开。

也就是说,从文件中读取一行文本,然后使用单独的Scanner 解析该行。

这使您可以将逻辑和工作流程分开,而不会搞砸(但是,这就是我)。

您还需要考虑到,如果 price 为空,您将有一个悬空元素,应该读取(并丢弃)该元素。

最后,利用hasNextInt 循环遍历剩余的令牌

例如...

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner("""
                                      19387,73616,11/10/2021,7268,8271
                                      81716,16381,11/10/2021,2736,3715,7362,837
                                      75464,27315,11/10/2021,,3545,7645,460
                                      """);
        while (scanner.hasNextLine()) {
            Scanner line = new Scanner(scanner.nextLine()).useDelimiter(",");
            int id1 = line.nextInt();
            int id2 = line.nextInt();
            String date =  line.next();

            float price = 0;
            if (line.hasNextFloat()) {
                price = line.nextFloat(); 
            } else {
                line.next();
            }

            System.out.println(id1);
            System.out.println(id2);
            System.out.println(date);
            System.out.println(price);

            List<Integer> otherIds = new ArrayList<>(25);
            while (line.hasNextInt()) {
                otherIds.add(line.nextInt());
            }

            System.out.println(otherIds);

            System.out.println();
        }
    }
}

这将打印...

19387
73616
11/10/2021
7268.0
[8271]

81716
16381
11/10/2021
2736.0
[3715, 7362, 837]

75464
27315
11/10/2021
0.0
[3545, 7645, 460]

【讨论】:

    【解决方案2】:

    您非常接近实际的解决方案。在这种情况下,inputFile.nextInt() 将在找不到更多整数时返回 NULL。这就是为什么我们可以使用 while 循环来追加到数组的原因。

    while(inputFile.nextInt())
    {
         id3.add(inputFile.nextInt());
    }
    

    【讨论】:

    • "inputFile.nextInt() 将返回 NULL" - 我很确定它不会,请阅读 JavaDocs。不管你多么接近这个想法
    • 对不起,你是对的。没有阅读文档。但是,while 循环的想法仍然成立。
    • 是的,“想法”是正确的,实现不是;)
    • 是的,我正在考虑为数组列表使用另一个 while 循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多