在Java中从多个列表中合并和删除重复的最佳方式
发布时间:2020-12-14 05:08:51 所属栏目:Java 来源:网络整理
导读:我有一种情况,我会收到2 ArrayList Widget我需要能够合并所有列表,并删除任何重复的Widget,以便我只收集1个ArrayList Widget它包含所有合并列表中的所有小部件,但没有任何重复. 假设Widget有一个重写的equals方法,可以用于确定两个Widget是否是重复的,尽管可
我有一种情况,我会收到2 ArrayList< Widget>我需要能够合并所有列表,并删除任何重复的Widget,以便我只收集1个ArrayList< Widget>它包含所有合并列表中的所有小部件,但没有任何重复.
假设Widget有一个重写的equals方法,可以用于确定两个Widget是否是重复的,尽管可能有更好的方法: public ArrayList<Widget> mergeAndRemoveDupes(ArrayList<Widget> widgets...) { // ??? } 寻找最有效的方法来实现这一点.我很高兴使用Apache Commons或任何其他可以帮助我的开放源代码库!提前致谢! 解决方法
对于每个ArrayList< Widget>,将每个元素添加到Set< Widget> (HashSet或TreeSet,取决于它们是否可以以某种方式进行排序,或者可以是hash),使用addAll.默认情况下,集合不包含重复项.
如果需要结束,您可以将此Set转换为(Array)列表. 注意,如果您决定使用HashSet,您将需要为您的Widget类实现hashCode,但如果您有覆盖的equals,则应该这样做. 编辑:这里有一个例子: //Either the class itself needs to implement Comparable<T>,or a similar //Comparable instance needs to be passed into a TreeSet public class Widget implements Comparable<Widget> { private final String name; private final int id; Widget(String n,int i) { name = n; id = i; } public String getName() { return name; } public int getId() { return id; } //Something like this already exists in your class @Override public boolean equals(Object o) { if(o != null && (o instanceof Widget)) { return ((Widget)o).getName().equals(name) && ((Widget)o).getId() == id; } return false; } //This is required for HashSet //Note that if you override equals,you should override this //as well. See: https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java @Override public int hashCode() { return ((Integer)id).hashCode() + name.hashCode(); } //This is required for TreeSet @Override public int compareTo(Widget w) { if(id < w.getId()) return -1; else if(id > w.getId()) return 1; return name.compareTo(w.getName()); } @Override public String toString() { return "Widget: " + name + ",id: " + id; } } 如果要使用TreeSet,但不想实现Comparable< T>在您的Widget类中,您可以给该集本身一个Comparator对象: private Set<Widget> treeSet; .... treeSet = new TreeSet<Widget>(new Comparator<Widget>() { public int compare(Widget w1,Widget w2) { if(w1.getId() < w2.getId()) return -1; else if(w1.getId() > w2.getId()) return 1; return w1.getName().compareTo(w2.getName()); } }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |