首页 > 解决方案 > 在 n 行中拆分文件并将它们添加到字符串的 ArrayList

问题描述

我想将文件拆分为 8 行并将它们放入字符串的 ArrayList 中。

例如,这个文件:

public class Example {
    private int result = 2 + 1;
    private int result2 = 3 * 2;
    private int result3 = 3 + 3;

    private int result4 = 5 + 1 * 74;
    private String a = "This is a string";
    System.out.println("Just a print");
    int b = 12;

    System.out.println("Another print");
}

将导致以下两个条目 ArrayList:

ArrayList<String> fileSplitted = { "public class Example {\nprivate int result = 2 + 1;\nprivate int result2 = 3 * 2;\nprivate int result3 = 3 + 3;\n\nprivate int result4 = 5 + 1 * 74;\nprivate String a = "This is a string";\nSystem.out.println("Just a print");" ; "int b = 12;\n\nSystem.out.println("Another print");\n}" }

所以我写了这个函数:

public static ArrayList<String> splitFile(File file) throws FileNotFoundException {
        ArrayList<String> fileSplitted = new ArrayList<String>();
        ArrayList<String> fileSplittedReturn = new ArrayList<String>();
        Scanner input = new Scanner(file);
        StringBuilder tmp = new StringBuilder();
        int count = 0;
        int countTotal = 0;

        while (input.hasNextLine()) {
            fileSplitted.add(input.nextLine());
        }

        for (String s : fileSplitted) {
            if (count < 8 && countTotal != fileSplitted.size() - 1) {
                tmp.append(s);
                count++;
            } else if (count == 8 && countTotal != fileSplitted.size() - 1) {
                fileSplittedReturn.add(tmp.toString());
                tmp.setLength(0);
                tmp.append(s);
                count = 1;
            } else if (countTotal == fileSplitted.size() - 1) {
                fileSplittedReturn.add(tmp.toString());
            }
            countTotal++;
        }

        return fileSplittedReturn;
    }

尽管它可以工作(我还没有发现任何错误,但我不能确定),但我认为它有点沉重而且不容易阅读。

有没有办法让我修饰这个功能,让它更轻量级?

标签: javastringfilearraylist

解决方案


从文件中读取所有行之后(如果我们已经知道文件不会太大,这是一种可接受的方法)

我会使用类似的东西对线条进行分组

public static List<String> groupLines(List<String> lines, int groupSize){
    int remaining = lines.size() % groupSize;
    int nbSplit = lines.size() / groupSize;

    List<String> target = new ArrayList<>();

    for(int i = 0; i < nbSplit; i++){
        target.add(getLines(lines,i * groupSize, groupSize));
    }

    if(remaining > 0){
        target.add(getLines(lines, nbSplit * groupSize, remaining));
    }

    return target;
}

private static String getLines(List<String> lines, int from, int size){
    return lines.stream()
            .skip(from)
            .limit(size)
            .collect(Collectors.joining("\n"));
}

推荐阅读