【发布时间】:2017-11-10 15:57:25
【问题描述】:
我有一个包含以下内容的 CSV 文件:
2017-10-29 00:00:00.0,"1005",-10227,0,0,0,332894,0,0,222,332894,222,332894 2017-10-29 00:00:00.0,"1010",-125529,0,0,0,420743,0,0,256,420743,256,420743 2017-10-29 00:00:00.0,"1005",-10227,0,0,0,332894,0,0,222,332894,222,332894 2017-10-29 00:00:00.0,"1013",-10625,0,0,-687,599098,0,0,379,599098,379,599098 2017-10-29 00:00:00.0,"1604",-1794.9,0,0,-3.99,4081.07,0,0,361,4081.07,361,4081.07
所以第 1 行和第 3 行是重复的。 现在我想读入文件并在控制台中打印出重复的行。
我设置了这个 Java 代码,读取文件并将其逐行放入 ArrayList 中。然后我创建一个不可变的 复制、循环遍历 ArrayList 并在 binarySearch 中使用 ArrayList 的不可变副本:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ReadValidationFile {
public static void main(String[] args) {
List<String> validationFile = new ArrayList<>();
try(BufferedReader br = new BufferedReader(new FileReader("validation_small.csv"));){
String line;
while((line = br.readLine())!= null){
validationFile.add(line);
}
} catch (FileNotFoundException e) {
//e.printStackTrace();
System.out.println("file not found " + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
List<String> validationFileCopy = Collections.unmodifiableList(validationFile);
for(String line : validationFile){
int comp = Collections.binarySearch(validationFileCopy,line,new ComparatorLine());
if (comp <= 0){
System.out.println(line);
}
}
}
}
比较器类:
import java.util.Comparator;
public class ComparatorLine implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
}
我希望这行会被打印出来:
2017-10-29 00:00:00.0,"1005",-10227,0,0,0,332894,0,0,222,332894,222,332894
但我得到的输出是这样的:
2017-10-29 00:00:00.0,"1010",-125529,0,0,0,420743,0,0,256,420743,256,420743
你能帮我看看我做错了什么吗?我的比较器我觉得还可以。我怎么了 数组列表?
【问题讨论】:
-
你实际上不需要两个循环。在第一种情况下循环本身,添加到集合而不是列表。如果 add 为一行返回 false,也添加到重复行列表...然后打印重复列表..
-
谢谢 可选,我将 while 循环中的代码调整为
boolean add = validationFile.add(line); if(!add){ System.out.println(line); },它工作正常