如何从文本文件中读取前三个三位数字?

时间:2018-12-22 18:49:48

标签: java

我想在每行列表中添加3个三位数字。

我试图创建一个计数,但是做得不好。

int i = 0;
try (Scanner s = new Scanner("final.txt")))  {
    String line;
    while (s.hasNextLine()) {
        int change2Int = s.nextInt();
        s.nextLine(); // ignore the rest of the line
        figures [i] = change2Int;
        i++;
    }
}

}

所以我有一个大约20行的txt文件。一行看起来像这样:(第一个块是FROM:时,分,秒。||第二个是TO:时,分,秒。||,最后是:电话号码|

这是txt文件中的一行: “ 6 1 0 6 2 25 392712621”

我想添加前三个数字(前三个表示:“从小时(6)分钟(1)秒(0)

下一个3表示“至:小时(6)分钟(2)秒(25)

并且392712621是电话号码。

我想将前三个数字添加到列表中,然后将后三个数字添加到另一个列表中。 并做到每一行。

我该怎么办?

4 个答案:

答案 0 :(得分:0)

使用具有三个分组操作的正则表达式。将三个数字序列分组,然后是三个数字序列,然后是最后一个序列。测试输入是否与模式匹配,然后拉出三组。喜欢,

String s = "6 1 0 6 2 25 392712621";
Pattern p = Pattern.compile("(\\d+ \\d+ \\d+) (\\d+ \\d+ \\d+) (\\d+)");
Matcher m = p.matcher(s);
if (m.matches()) {
    System.out.println(m.group(1).trim());
    System.out.println(m.group(2).trim());
    System.out.println(m.group(3).trim());
}

我得到了(按要求)

6 1 0
6 2 25
392712621

答案 1 :(得分:0)

这可以解决问题,

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner s = new Scanner(new File("final.txt"));

        List<String> firstList = new ArrayList<>();
        List<String> secondList = new ArrayList<>();

        while (s.hasNextLine()) {
            String line = s.nextLine();
            String[] digits = line.split(" ");
            for (int i = 0; i < 3; i++) {
                firstList.add(digits[i]);
            }
            for (int i = 3; i < 6; i++) {
                secondList.add(digits[i]);
            }
        }
        System.out.println(firstList);
        System.out.println(secondList);
    }
}

答案 2 :(得分:0)

首先,我建议按以下方式读取文件:

try (Stream<String> stream = Files.lines(Paths.get("final.txt"))) {
     ...
} catch (IOException e) { e.printStackTrace(); }

因为它将使您的生活更加轻松:

第二,我不会维护两个相关数据列表,而是创建一个模型来表示它:

class HourModel {          
    public HourModel(LocalTime from, LocalTime to) {
        this.from = from;
        this.to = to;
    }

    private LocalTime from;
    private LocalTime to;
}

不是最有意义的名称,但我将其称为HourModel仅出于示例目的。我希望您将其重命名以使其更有意义。

最后,您可以使用以下方法获得想要的结果:

List<HourModel> hourModels;
try (Stream<String> stream = Files.lines(Paths.get("final.txt"))) {
      hourModels = stream.map(line -> {
          String[] numbers = line.split(" ");
          LocalTime from = LocalTime.of(Integer.parseInt(numbers[0]),Integer.parseInt(numbers[1]),Integer.parseInt(numbers[2]));
          LocalTime to = LocalTime.of(Integer.parseInt(numbers[3]),Integer.parseInt(numbers[4]),Integer.parseInt(numbers[5]));
          return new HourModel(from , to);
  }).collect(Collectors.toList());    
} catch (IOException e) { e.printStackTrace(); }

请注意,我使用LocaleTime来表示hourminutesecond只是因为这是更好的表示方式。

答案 3 :(得分:0)

我认为在这种情况下,使用Scanner并不是最佳选择(但是您可以根据需要)。我提供使用Java8功能和Stream来逐行读取文本文件。

还有我们的RegExp,它们具有代表每行的命名组。

因此,您可以使用LocalTime

public static void readFile(Path path, List<LocalTime> from, List<LocalTime> to) throws IOException {
    final Pattern pattern = Pattern.compile("(?<fromHour>\\d+)\\s+(?<fromMinute>\\d+)\\s+(?<fromSecond>\\d+)\\s+" +
            "(?<toHour>\\d+)\\s+(?<toMinute>\\d+)\\s+(?<toSecond>\\d+)\\s+(?<data>\\d+)");

    Files.lines(path)
         .map(pattern::matcher)
         .filter(Matcher::matches)
         .forEach(matcher -> {
             from.add(localTime(matcher, "fromHour", "fromMinute", "fromSecond"));
             to.add(localTime(matcher, "toHour", "toMinute", "toSecond"));
         });
}

private static LocalTime localTime(Matcher matcher, String hour, String minute, String second) {
    int fromHour = Integer.parseInt(matcher.group(hour));
    int fromMinute = Integer.parseInt(matcher.group(minute));
    int fromSecond = Integer.parseInt(matcher.group(second));
    return LocalTime.of(fromHour, fromMinute, fromSecond);
}