在Java中从多个列表中合并和删除重复的最佳方式

前端之家收集整理的这篇文章主要介绍了在Java中从多个列表中合并和删除重复的最佳方式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,我会收到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());
            }
           });

猜你在找的Java相关文章