我创建了一个 csv 文件行值的 string[] 数组,并将其存储在数组列表中。我需要根据 arr[0] 对它进行分组,并删除该组中任何重复的数组值。
每次可以有 n 列。我以 3 列为例
List<String[]> rowList = new ArrayList<String[]>();
BufferedReader reader = null;
reader = new BufferedReader(new FileReader("C:\\test.csv"));
String[] currLineSplitted;
while (reader.ready()) {
currLineSplitted = reader.readLine().split(",");
rowList.add(currLineSplitted);
}
Set<String[]> s = new TreeSet<String[]>(new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
int cmp = 0;
if((o1[0]).compareTo(o2[0])==1){
for(int i=1;i<currLineSplitted.length;i++){
cmp = (o1[i]).compareTo(o2[i]);
}
} else {
cmp=0;
}
return cmp;
}
});
s.addAll(rowList);
List<Object> res = Arrays.asList(s.toArray());
for(Object obj:res){
String[] arr = (String[])obj;
System.out.println(arr[0]+","+arr[1]+","+arr[2]);
}
输入文件:
{"1","a","gh"}
{"1","a","rs"}
{"1","b","cd"}
{"2","a","xy"}
{"2","b","xy"}
{"3","a","pq"}
输出:
1,a,gh
2,b,xy
所需输出:
1,a,gh
1,a,rs //should be deleted as in group 1 a is repeated
1,b,cd
2,a,xy
2,b,xy //should be deleted as in group 2 xy is repeated
3,a,pq
最佳答案
你几乎是对的。我稍微修改了你的比较功能。因此,用这个替换你的比较函数
@Override
public int compare(String[] o1, String[] o2) {
int cmp = 0;
if(o1[0].equals(o2[0])){//grouping 1st column
for(int i=1;i<o1.length;i++){
cmp = (o1[i]).compareTo(o2[i]);
if(cmp==0)
return cmp;// if two column matched return immediately
}
} else {
return o1[0].compareTo(o2[0]);
}
return cmp;
}
记住不能保证String.compare会返回1。它按字典顺序比较两个字符串,如果两个字符串匹配则返回零。 因此,在您的代码中,以下行会产生逻辑错误。
o1[0]).compareTo(o2[0])==1
了解有关字符串比较器的更多信息 here
关于java - 删除组内重复的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25657524/