如果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循环中。因为没有以前的方法,我被困住了。
如果我有任何方法可以使用,请告诉我。我不能使用FileUtils.readLines(),因为它是一个3GB的文件,我不想使用我的java内存来存储所有文件。
答案 0 :(得分:3)
我建议您重新考虑您的算法。您缺少令牌,因为您的算法涉及提前读取以确定序列何时中断,但您并未将下一行输入收集到您放置的相同结构中,并且#34;复制&#34;条目。
您无需向后阅读即可解决此问题。如果您知道输入始终是排序的,则只需逐行读取并保留对最后一行的引用(以与当前行进行比较)。
答案 1 :(得分: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];
}
}