【发布时间】:2019-03-10 08:22:09
【问题描述】:
我有一个包含多行的文本文件,每行 3 个逗号分隔的条目。
例子:
苏联,Larisa_LATYNINA,18
美国,Michael_PHELPS,16
苏联,Nikolay_ANDRIAOV,15
我试图将它们分成 3 个数组,其中 1 个代表国家,1 个代表个人,1 个代表奖牌。
ArrayList<String> country = new ArrayList<>();
ArrayList<String> name = new ArrayList<>();
ArrayList<Integer> medals = new ArrayList<>();
java.io.File file = new java.io.File("Olympics.txt");
Scanner input = new Scanner(file);
input.useDelimiter(" , ");
while(input.hasNext()) {
country.add(input.next());
name.add(input.next());
medals.add(input.nextInt());
}
但每次我尝试运行它时都会出错。我不完全确定如何将文件中的每个“列”分成它们自己的数组。
如果我使用 useDelimiter(","); 而不是 useDelimiter(" , "); 我会收到以下异常:
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at OlympicWinners.main(OlympicWinners.java:14)
这是我得到的错误。第 14 行是
Medals.add(input.nextInt());
【问题讨论】:
-
请显示minimal reproducible example(尤其是错误、预期和当前输出)。
-
请遵守命名约定,变量名总是小写。所以
country,name,medals。 -
请注意,您可能还想按行阅读,然后用逗号分隔。否则,您可能会因为输入错误而切换到下一行而不注意。沿着:
List<String> lines = Files.readAllLines(Paths.get("Olympics.txt"))。然后String[] data = line.split(",");. -
仅作记录:A) 编写自己的 CSV 解析器逻辑是一个很好的练习,但在现实世界中,您最好使用众多现有库之一。你在这里重新发明轮子(重复其他人过去犯的所有错误) B)小心将这些信息放入 3 个不同的列表中,并通过 index 将它们“连接”起来。而是考虑创建一个类来模拟文件中的一个 ROW,例如“MedalWinner”。该类将具有三个字段(用于国家、名称、计数)。然后将该类的一个对象放在一个列表中。你的想法
-
使用三个列表来表示一起属于 one 对象的数据与在良好的 OOP 中处理此类任务的方式完全相反。