0

如果 Scanner 类上有 previous() 方法,我的问题就可以解决。我问这个问题是否有任何方法可以实现此功能。

输入:一个文件,内容如下

a,1
a,2
a,3
b,1
c,1
c,2
c,3
c,4
d,1
d,2
d,3
e,1
f,1

我需要创建一个包含相同字母表的所有行的列表。

try {
            Scanner scanner = new Scanner(new File(fileName));
            List<String> procList = null;
            String line =null;
            while (scanner.hasNextLine()){
                line = scanner.nextLine();
                System.out.println(line);
                String[] sParts = line.split(",");
                procList = new ArrayList<String>();
                procList.add(line);
                boolean isSamealpha = true;
                while(isSamealpha){
                    String s1 = scanner.nextLine();
                    if (s1.contains(sParts[0])){
                        procList.add(s1);
                    }else{
                        isSamealpha = false;
                        System.out.println(procList);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

我得到像

a,1
[a,1, a,2, a,3]
c,1
[c,1, c,2, c,3, c,4]
d,2
[d,2, d,3]
f,1
[f,1]

如您所见,它错过了 b 和 e 的列表。如果我有scanner.previous() 方法,我会把它放在第二个while 循环的else 中。因为没有以前的方法,所以卡住了。

请让我知道是否有任何我可以使用的方法。我不能使用 FileUtils.readLines() 因为它是一个 3GB 的文件,我不想使用我的 java 内存来存储所有文件。

4

2 回答 2

3

我建议您重新考虑您的算法。您缺少标记,因为您的算法涉及提前读取以确定序列何时中断,但是您没有将下一行输入收集到您放置“重复”条目的相同结构中。

您无需向后阅读即可解决此问题。如果您知道输入始终是排序的,只需逐行阅读并保留对最后一行的引用(与当前行进行比较)。

于 2013-01-17T17:51:44.673 回答
1

下面是一些应该有帮助的示例代码。(我只打了这个;我没有检查。)

Scanner scanner = new Scanner(new File(fileName));
List<String> procList = null;
String line = null;
String previousAlpha = null;
while (scanner.hasNextLine()){
    line = scanner.nextLine();

    if (previousAlpha == null) {
        // very first line in the file
        procList = new ArrayList<String>();
        procList.add(line);
        System.out.println(line);
        previousAlpha = line.split(",")[0];
    }
    else if (line.contains(previousAlpha)) {
        // same letter as before
        procList.add(line);
    }
    else {
        // new letter, but not the very first
        // line
        System.out.println(procList);

        procList = new ArrayList<String>();
        procList.add(line);
        System.out.println(line);
        previousAlpha = line.split(",")[0];

    }
}
于 2013-01-17T18:18:14.600 回答