有什么方法可以从哈希图中找到 ArrayList 中的重复值吗?

Is there any way to find the duplicate values i.e ArrayList from a hash map?

例如:-

我以以下形式声明了一个 hashMap:

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

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

并且我在曲目中添加了项目

并且我将项目添加为:-

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

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

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

实现此目的的一种方法是遍历值,将它们全部放入 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 class 必须实现 equalshashCode 方法。使用 equals 方法比较具有相同值的两个对象应该 return 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;
}

我假设我们搜索重复的 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