【问题标题】:How can i only read Strings or Integers when i read .txt file with Scanner Class in Java当我用 Java 中的 Scanner 类读取 .txt 文件时,如何只读取字符串或整数
【发布时间】:2018-11-08 16:28:16
【问题描述】:

大家好,这是我的第一个问题,如果我有任何错误或错误,我很抱歉。

所以我正在做一件我目前一直失败的事情,那就是,正如它在标题中所说,只从 .txt 文件中读取字符串和整数。这是我的代码:

 File file = new File("C:\\Users\\Enes\\Desktop\\test.txt");
    Scanner scn = new Scanner(file);
    String[] s = new String[10];
    int i = 0;
    int[] fruits = new int[10];

    while (scn.hasNextInt()) {

        fruits[i++] = scn.nextInt();

    }while (scn.hasNext()) {

        s[i++] = scn.next();

    }

    for (int elm : fruits) {
        System.out.print(elm + "\t");
        System.out.println("\n");
    }
    for (String ele : s) {
        System.out.print(ele + "\t");
    }

这是写在 .txt 文件上的内容

Apple 5
Pear 3

输出如下:

0   0   0   0   0   0   0   0   0   0   
Apple   5   Pear    3   null    null    null    null    null    null

所以我想得到 Apple 和 Pear,不同数组中的字符串以及不同数组中的整数 5 和 3。我怎样才能做到这一点?任何帮助将不胜感激。谢谢大家!

【问题讨论】:

  • 如果您厌倦了输入所有双反斜杠,您可以使用正斜杠"C:/Users/Enes/Whatever/Wherever"
  • 哦,是的,我不知道。感谢大卫的提示!我一定会用它

标签: java arrays string java.util.scanner java-io


【解决方案1】:

首先,我会将您的变量重命名为有用的名称:

String[] names = new String[10];
int[] counts = new int[10];

现在,您正在尝试获取所有 10 个数字,然后是所有 10 个名称。但这不是您的数据的布局方式。

我会使用扫描仪抓取线,然后从那里拆分:

Scanner sc = new Scanner(new File(file));
int index = 0;
while(sc.hasNextLine()) {
    String line = sc.nextLine();
    String[] tokens = line.split(" ");
    names[index] = tokens[0];
    counts[index] = Integer.parseInt(tokens[1]);
    index++;
}

对于输出,我们同时迭代两个循环:

for(int i = 0; i < 10; i++) {
    System.out.println(names[i] + "\t" + counts[i]);
}

【讨论】:

  • 这是正确的,没有任何问题,但是,您可以使用第二个 Scanner 来解析 line 而不是使用 String 解析工具 - 只是说;)
  • @MadProgrammer 你可以,我想。它似乎不是适合这项工作的工具,但我想如果你真的讨厌数组,你可以这样做。 String.split 针对单个字符拆分进行了微优化...
  • 不,我的意思是 Scanner 可以解析 String - 人们似乎忘记了这一点 ;) - 我的意思是我不喜欢数组并且会使用 List 和 POJO,但我尊重 OP 可能还没有为此做好准备的事实:D
  • 啊,是的,我认为这是一个完全正确的观点。你是对的,它并不常见,但肯定很有用。我经常用它来解析命令行和网络协议行。我认为如果格式不是单个字符分隔的(例如,规范允许您用以太制表符或空格分隔),那么扫描仪会比split 更好。
  • 谢谢我的好心先生!你是救生员。感谢您的回复和改进我的代码。但那里似乎没有什么缺陷。它应该是 String[] tokens = line.split(" ");。再一次感谢你。成功了!
【解决方案2】:

这是对 corsiKa 答案的改编(它本身就是正确的 +1),但它演示了使用第二个 Scanner 来解析 line ...

int index = 0;
while (sc.hasNextLine()) {
    String line = sc.nextLine();
    Scanner lineScanner = new Scanner(line);
    names[index] = lineScanner.next();
    counts[index] = lineScanner.nextInt();
    index++;
}

因为人们似乎忘记了Scanner 可以解析String

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2023-03-15
    • 2010-11-30
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多