使用useDelimiter()联接子字符串

时间:2018-07-13 19:53:16

标签: java

我的方法readDataFromFile()可以读取以下文本文件:

Bird    Golden Eagle    Eddie
Mammal  Tiger   Tommy
Mammal  Lion    Leo
Bird    Parrot  Polly
Reptile Cobra   Colin

第一列是动物的“类型”,第二列是“物种”,第三列是“名称”。

当前输出:

Bird  Golden Eagle  < (Golden and Eagle count as different substrings).
    Mammal  Tiger Tommy
    Mammal  Lion Leo
    Bird  Parrot Polly
    Reptile  Cobra Colin
  • 我将如何使用useDelimiter方法将“金鹰”计为一个物种?

当前代码:

while(scanner.hasNextLine())
       {
       String type = scanner.next();
       String species = scanner.next();
       String name = scanner.next();
       System.out.println(type + "  " + species + " " + name);
       scanner.nextLine();

       addAnimal( new Animal(species, name, this) );
       }

2 个答案:

答案 0 :(得分:2)

  

第一行的“金鹰”都用制表符分隔

那是不正确的。

source of your question显示各列均由制表符(<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="bgimages">A</div> <div class="bgimages">B</div> <div class="bgimages">C</div> <div class="bgimages">D</div>\t隔开,但\u0009Golden则由空格字符(Eagle)。

请勿使用\u0020读取文件。它非常慢,不是解析文件的适当工具。而是使用ScannerBufferedReader方法,然后将行readline()分成列。

演示

split()

输出

try (BufferedReader in = Files.newBufferedReader(Paths.get("animals.txt"))) {
    for (String line; (line = in.readLine()) != null; ) {
        String[] values = line.split("\t");
        for (String value : values)
            System.out.printf("%-15s", value);
        System.out.println();
    }
}

如您所见,Bird Golden Eagle Eddie Mammal Tiger Tommy Mammal Lion Leo Bird Parrot Polly Reptile Cobra Colin 文本未拆分。

答案 1 :(得分:0)

您所需要的只是将正确的列分度设置为Scanner regexp 。在下面的示例中,我将\t设置为列分隔符,将\n设置为新行分隔符:

public static List<Animal> readAnimals(InputStream in) {
    try (Scanner scan = new Scanner(Foo.class.getResourceAsStream("./animals.txt"))) {
        scan.useDelimiter("[\\t|\\n]");

        List<Animal> animals = new LinkedList<>();

        while (scan.hasNext()) {
            animals.add(new Animal(scan.next(), scan.next(), scan.next()));
        }

        return animals;
    }
}