java - 删除组内重复的列值

标签 java arraylist collections treeset

我创建了一个 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/

相关文章:

java - 从数组中返回数字序列?

java - 使用 HashMap 时,值和键在迭代时是否保证顺序相同?

java - spring mvc中的不同@ModelAttribute

java - 解决线程中的IllegalMonitorException?

java - 如何让消息出现在不同的侧面?

java - 如何获取pdf文件每页的尺寸

java - 将数组列表转为数组

java - 如何将包含整数的 ArrayList 转换为原始 int 数组?

c# - 将值附加到列表

ruby-on-rails - Ruby on Rails 平均水平?