java - 在 Java 中合并和删除多个列表中的重复项的最佳方法

标签 java performance algorithm list merge

我的情况是我将收到 2+ ArrayList<Widget>我需要能够合并所有列表并删除任何重复的 Widget这样我就只有 1 ArrayList<Widget>包含所有 Widget来自所有合并列表的 s,但没有任何重复项。

假设Widget有一个被覆盖的 equals 可以用于确定两个Widget是否存在的方法s 是重复的,尽管可能有更好的方法:

public ArrayList<Widget> mergeAndRemoveDupes(ArrayList<Widget> widgets...) {
    // ???
}

寻找算法上最有效的方法来完成此任务。我很高兴使用 Apache Commons 或任何其他也能帮助我的开源库!提前致谢!

最佳答案

对于每个 ArrayList<Widget> , 将每个元素添加到 Set<Widget> ( HashSetTreeSet ,取决于它们是否可以某种方式排序,或者是否可哈希)利用 addAll .默认情况下,集不包含重复项。

你可以转换这个 Set回到(Array)List如果你需要在最后。

请注意,您需要实现 hashCode为你的 Widget如果你决定使用 HashSet 类, 但如果你有一个被覆盖的 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: http://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 - 在 Java 中合并和删除多个列表中的重复项的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453255/

相关文章:

java - 使用包裹发送未知数据类型的对象时出现问题

java - 启动 100 个按钮的更有效方法

performance - 关于加速 Drupal 站点的提示

objective-c - 拥有许多小的 CATextLayer 会导致调整窗口大小的速度变慢

algorithm - O(n) 符号中 n 的可能含义?

java - 在多个排序列表中高效地查找元素?

java - JVM(Java 传输客户端)缓存 DNS 条目 AWS 的 IP 地址

java - 在 Clojure 中将十六进制摘要转换为长整数

algorithm - 我如何找到时间复杂度 T(n) 并证明它是有界的(Big Theta)?

java - 如何使用 Spring Boot 检测并禁止 IP 地址发出过多请求?