【问题标题】:Merging ArrayList of Model elements without duplicates合并模型元素的 ArrayList 而没有重复
【发布时间】:2016-05-12 05:52:12
【问题描述】:

您好,我有两个数组列表 List l1 和 List l2,Name,age,sex,uniqID,marks 是列表中的数据。我想加入 l1 和 l2 而没有重复。uniqID 对每个学生都是唯一的。我一直在遍历所有元素并比较每个元素。但是我的列表将包含大约 20k 个项目,因此循环花费了太多时间。我试过了 all the answers from this post 对我没有任何帮助。有什么建议吗?

【问题讨论】:

  • 您是否在“Person”类中覆盖了equals?一旦实现equals,删除像这篇文章stackoverflow.com/a/14361428/966852 中建议的重复项应该可以工作。
  • @Shanu :您可以使用HashSet 或任何实现set 接口的集合..!!

标签: java android


【解决方案1】:

简单示例:

public class Person{
    int id;
    String name;
    //fields, getter, setter, constructor omited....

    @Override
    public boolean equals(Object o){
        if (!(o instanceof Person)){
            //implicit null check
            return false;
        }
        return this.id==((Person)o).id;
    }

    @Override
    public int hashCode(){
        return this.id;
    } 
}

Person 类现在确实实现了 equals 和 hashCode。 equals 被 java 用来判断一个对象是否是另一个对象的副本。 hashCode 本身不是必需的,但建议将hashCodeequals 一起覆盖。

如果这两种方法都实现了,你可以简单地使用java中的内置方法和数据结构:

有列表:

List<Person> listA = new ArrayList<>();
List<Person> listB = new ArrayList<>();
// filling the lists omitted
List<Person> mergedList=new ArrayList<>();
mergedList.addAll(listA);
mergedList.removeAll(listB);
mergedList.addAll(listB);

或搭配套装:

List<Person> listA = new ArrayList<>();
List<Person> listB = new ArrayList<>();
// filling the lists omitted
Set<Person> mergedSet=new HashSet<>();
mergedSet.addAll(listA);
mergedSet.addAll(listB);

【讨论】:

  • 虽然列表正在消除所有重复项,但大约需要 1 分钟。
  • 你用的是哪个例子?使用Set 的解决方案应该比使用List 的解决方案执行得更好。如果合并后仍需要列表的顺序,可以使用LinkedHashSet
  • 我会尝试使用 set。不,我没有使用 LinkedHashSet。我应该。?
  • 列表有特定的顺序。常规 Set 没有任何信息,即首先添加了哪个元素。迭代集合的元素可以以任何顺序返回元素。另一方面,LinkedHashSet 将按照添加元素的顺序返回元素。因此,如果合并后两个列表中元素的顺序相关,则应使用LinkedHashSet。在任何其他情况下,普通的HashSet 就足够了。
  • 我使用了第二个。消除重复项后,我将集合转换为数组列表,然后对列表进行排序以供最终使用。你有什么其他的建议。?非常感谢
【解决方案2】:

您可以将这两个数组列表组合起来并将其传递给 HashSet 对象 由于 Set 不包含重复项,您可以执行以下操作

ArrayList<String> a=new ArrayList<String>();
ArrayList<String> b=new ArrayList<String>();

b.addAll(a);

如果要保留元素的顺序,请使用 LinkedHashSet

LinkedHashSet<String> result=new LinkedHashSet<String>(b);

【讨论】:

  • 合并这两个列表并将它们添加到Set 是不必要的工作。您可以将两个列表都调用addAll 到(空)集。此外,问题是自定义类中缺少equalshashCode,这将阻止Set 正常工作。
猜你喜欢
  • 2011-04-05
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多