【问题标题】:remove duplicates from List<String[]>从 List<String[]> 中删除重复项
【发布时间】:2013-10-09 17:30:39
【问题描述】:

我正在寻找一种从列表中删除重复项的好方法。

List<String[]> rowList = new ArrayList();
    rowList.add(new String[]{"1","a", "abc"});
    rowList.add(new String[]{"2","b", "def"});
    rowList.add(new String[]{"3","c", "ghi"});
    rowList.add(new String[]{"4","a", "jkl"});
    rowList.add(new String[]{"5","d", "mno"});
    rowList.add(new String[]{"6","e", "pqr"});
    rowList.add(new String[]{"7","b", "stu"});

从此 rwoList 中,我只想要条目:1、2、3、5 和 6。这意味着我只有一列感兴趣,在本例中为第 2 列(a、b、c、..) 这只是一个简单的示例,我必须处理大量具有 300 列和最少 300000 行的表。另一个重要的一点是,我不会在列表中失去方向。

注意:我从 csv 文件接收数据。

【问题讨论】:

  • 每个常见问题。似乎没有努力谷歌它。所以投反对票。
  • 您是否从数据库中检索这些数据?有重复是否合法还是表明不一致?
  • @HaveANiceDay 你也是 :)
  • Heuster 所指的方向是:创建一个以某种方式实现equals 的“数据类”,这样如果您的关键列(或多列)相同,它就会返回true。然后使用Set

标签: java list duplicate-data duplicates


【解决方案1】:
  List<String[]> rowList = new ArrayList<String[]>();
  rowList.add(new String[]{"1","a", "abc"});
  rowList.add(new String[]{"2","b", "def"});
  rowList.add(new String[]{"3","c", "ghi"});
  rowList.add(new String[]{"4","a", "jkl"});
  rowList.add(new String[]{"5","d", "mno"});
  rowList.add(new String[]{"6","e", "pqr"});
  rowList.add(new String[]{"7","b", "stu"});

  Set<String[]> s = new TreeSet<String[]>(new Comparator<String[]>() {
         @Override
         public int compare(String[] o1, String[] o2) {
                return o1[1].compareTo(o2[1]);
        }
   });

通过添加到集合"s"来删除重复项

   s.addAll(rowList);
   List<Object> res = Arrays.asList(s.toArray());

打印结果

   for (Object object : res) {
         String[] array = (String[])object;
         System.out.println(array[0]+" "+ array[1] +", "+array[2]);
    }

输出

1 a, abc
2 b, def
3 c, ghi
5 d, mno
6 e, pqr

【讨论】:

  • 据我了解OP,订单不得更改。这将按关键列排序,不是吗?
  • 我建议使用LinkedHashSet,因为:“Set 接口的哈希表和链表实现,具有可预测的迭代顺序。”
  • @Fildor 是的,你是对的。为了使用 LinkedHashSet,我们需要使用带有 Comparator 或 Comparable 实现的 pojo。我认为使用 String[] 会有点复杂。
  • 非常感谢!您的解决方案正是我正在寻找的;)简单而快速。
【解决方案2】:

制作自定义方法isContain(List&lt;String[]&gt; rowList, String string)

private static boolean isContain(List<String[]> rowList, String secStr) {
    for (String[] strings : rowList) {
       if(strings[1].equals(secStr)){
           return true;
       }   
    }
    return false;
}

在将项目添加到List 之前检查此方法以删除重复项目,例如:

 List<String[]> rowList = new ArrayList();
    String[] sts= new String[]{"1", "a", "abc"};
    boolean contain= isContain(rowList,sts[1]);
    if(!contain){
        rowList.add(sts);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2012-09-28
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多