【问题标题】:Is there any way to find the duplicate values i.e ArrayList from a hash map?有没有办法从哈希图中找到 ArrayList 中的重复值?
【发布时间】:2020-08-14 10:56:46
【问题描述】:

例如:-

我已经声明了一个hashMap,格式如下:

Map<String, List<Tracks>> dupItems = new LinkedHashMap();

Tracks 是一个模型类,包含姓名、地址和年龄。

我在 Tracks 中添加了项目

我添加了以下项目:-

dupItems.add("Project",tracks);
dupItems.add("Report",tracks);

我想要的是重复曲目列表,即如何根据曲目的值匹配项目,即所有值必须相似。相同的名字,相同的地址,相同的年龄。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 只是在值上迭代值并将它们相等,我看不出问题。
  • @HopefullyHelpful 能否请您提供一个帮助太大的小演示

标签: java arraylist hashmap


【解决方案1】:

如果您正在寻找重复的地图值,即重复的列表轨道:

您可以做到这一点的一种方法是迭代这些值,将它们全部放在Set 数据结构中。如果您发现该值已经在集合中,那么它就是重复的,您将它添加到一个单独的数据结构中,该结构会记录重复值:

Set<List<Tracks>> findDuplicateValues(Map<String, List<Tracks>> dupItems) {
    Set<List<Tracks>> allValues = new HashSet<>();
    Set<List<Tracks>> duplicateValues = new HashSet<>();
    for (List<Tracks> value : dupItems.values()) {
        if (!allValues.add(value)) {
            // It's a duplicate!
            duplicateValues.add(value);
        }
    }
    return duplicateValues;
}

为了使其可靠地工作,Tracks 类必须实现 equalshashCode 方法。使用equals 方法比较两个具有相同值的对象应该返回true

另一方面,如果您正在寻找重复的 Tracks,无论哪个地图值列表包含它们:

你只需要在前面的方法中添加一个循环:

Set<List<Tracks>> findDuplicateValues(Map<String, List<Tracks>> dupItems) {
    Set<List<Tracks>> allValues = new HashSet<>();
    Set<List<Tracks>> duplicateValues = new HashSet<>();
    for (List<Tracks> value : dupItems.values()) {
        for (Tracks value : values) {
            if (!allValues.add(value)) {
                // It's a duplicate!
                duplicateValues.add(value);
            }
        }

    }
    return duplicateValues;
}

【讨论】:

  • 我不认为这是正确的。 OP 想要搜索重复的曲目,而不是重复的曲目列表。
  • 问题中的措辞不清楚,我将等待 OP 确认这是否是他们正在寻找的内容
  • 再想一想,这是一个微不足道的变化,所以我将两者都添加到答案中
【解决方案2】:

我假设我们搜索重复的 Tracks 实例。

public Set<Tracks> findDuplicates(Map<String, List<Tracks>> dupItems) {
    Set<Tracks> all = new HashSet<>();
    return dupItems.values().stream()
            .flatMap(list -> list.stream())  // build a single list of Tracks
            .filter(t -> !all.add(t))        // add track to all set but only continue if duplicate
            .collect(Collectors.toSet());    // store the remaining tracks in a set (to avoid duplicates in the result
}

只有当equals()函数被正确实现时,Set才会检查重复。

我的eclipse编辑器生成了:

private static class Tracks {
    String name;
    String address;
    int age;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Tracks other = (Tracks) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}

你也可以看看 Apache Commons EqualsBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2023-03-23
    • 2021-10-28
    • 2018-02-04
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多