【问题标题】:useDelimiter while loop not looping correctlyuseDelimiter while 循环未正确循环
【发布时间】:2015-03-10 04:12:42
【问题描述】:

我有一个文件,内容如下:

123,412

345,634

124,645

我只想获取每行中逗号前的数字并将它们添加到我的 arrayList 中。为什么我的代码只正确添加了第一个数字 (123) 而没有继续添加其余的数字?

try {
            File input = new File(filename);
            in = new Scanner(input);
            in.useDelimiter(",");

            while(in.hasNextLine()) {
                someArrayList.add(Integer.parseInt(in.next()));
            }

【问题讨论】:

  • @AlexandreLavoie:他们已经在使用 .next(),这是副本规定的。

标签: java java.util.scanner


【解决方案1】:

如果您想要逗号前的数字,那么只需将整行分开即可。无需为此使用分隔符。

Scanner input = new Scanner(new File(filename));
while(input.hasNextLine()) {
    String firstThreeDigits = input.nextLine().split(",")[0]
    someArrayList.add(Integer.parseInt(firstThreeDigits));
} 

【讨论】:

  • 这行得通!你能告诉我为什么在 split 语句之后有一个 [0] 吗?另外,逗号后面的数字你会怎么做?
  • split 正在返回一个字符串数组。 [0] 是第一个元素。如果您想要第二个元素,则必须将该行存储到一个临时字符串中,然后将其拆分,并按 [1] 对其进行索引。
【解决方案2】:

这里有两个错误:

  • in.hasNextLine() - 正在检查此扫描仪的输入中是否还有另一行
  • in.useDelimiter(","); - 如果您不断调用,则使用此分隔符仅适用于逗号

假设您的输入文件是逐行的,您可以将以上两个都更改为:

File input = new File(filename);
in = new Scanner(input);
in.useDelimiter(",|\n");

while (in.hasNext()) {
    someArrayList.add(Integer.parseInt(in.next()));
}

我认为更好的方法是使用readLine,然后使用String.split 结果行。

【讨论】:

  • 当我以这种方式尝试时,我得到:java.lang.NumberFormatException:对于输入字符串:“412”。在 412 之后有一个新行,最后一个引号在下一行。
  • @AlldaRage 您可以将其更改为 \\s+ 而不是 \n 或对来自 next() 的每个值调用 String#trim()
【解决方案3】:

这里我使用nextLine消费线路,然后使用正则表达式,拆分

try {
        File input = new File(filename);
        in = new Scanner(input);
        while(in.hasNextLine()) {
         someArrayList.add(
       Integer.parseInt(in.nextLine().split(",")[0].replace("\\s+", "")));
  }

取线,用“,”分割,得到第一个元素,把所有的空白都替换为空

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2022-01-22
    • 2016-05-03
    • 2016-04-24
    • 2017-01-18
    • 2012-03-29
    相关资源
    最近更新 更多