从HashMap条目列表中删除重复项

时间:2010-02-03 21:09:05

标签: java collections hashmap

我有一个List<HashMap<String,Object>>代表一个数据库,其中每个列表记录都是数据库行。

我的数据库中有10列。有两行,其中2个特定列的值等于。在使用数据库中的所有行更新列表后,我需要从列表中删除重复项。

什么是有效的方式?

仅供参考 - 我在查询数据库时无法做到明显,因为在加载数据库后,GroupName会在稍后阶段添加到Map。并且,由于Id列不是主键,因此将GroupName添加到Map后。您将拥有基于Id + GroupName组合的重复项!

希望我的问题有道理。如果我们需要更多澄清,请告诉我。

3 个答案:

答案 0 :(得分:3)

  1. 创建一个比较HashMaps的比较器,并通过比较您感兴趣的键/值对来比较它们。
  2. 使用Collections.sort(yourlist, yourcomparator);
  3. 现在,所有基于比较器的彼此相似的地图都在列表中相邻。
  4. 创建新列表。
  5. 浏览您的第一个列表,跟踪您最后看到的内容。如果当前值与最后一个值不同,请将其添加到新列表中。
  6. 根据您的比较器,您的新列表不应包含任何重复项。
  7. 迭代列表的成本是O(n)。排序为O(n log n)。所以这个算法是O(n log n)。

    我们也可以通过使用带有该比较器的TreeSet来实时排序。插入是O(log n)。我们必须这样做n次。所以我们得到O(n log n)。

答案 1 :(得分:1)

我参加了一个员工课程 并使用Integer创建Map,将Employee对象创建为键值对 这是我的地图

Map<Integer,Employee> map = new HashMap<Integer,Employee>();

Employee类是一个bean类,它具有name,id,names等属性; map允许唯一键。但如果您不想允许重复值 在你的地图中,你必须在bean类中超越equals方法。

@Override
public boolean equals(Object object){
    if (object == null) return false;
    if (object == this) return true;
    if (this.getClass() != object.getClass())return false;
    Employee employee = (Employee)object;
    if(this.hashCode()== employee.hashCode())return true;
   return false;
}  

并且在向Map添加键值时,您必须使用包含方法

if(!map.containsValue(map.get(id))){
   map.put(id,employee);
}

containsValue内部调用equals()方法,因此您可以超越等于方法 它将检查具有先前对象的每个值(对象)以及哈希码是否相同 它返回true表示两者都是相同的对象。

答案 2 :(得分:1)

经过多次搜索,我的状况一直相同,最后下面的解决方案对我有用。

  1. 创建POJO,覆盖等于()和 hashCode ()。
  2. 相等性应在具有.equal比较的所有数据成员上。
  3. 哈希代码计算为Objects.hash(filed1, field2, ...)
  4. 遍历列表并构造 POJO对象并将其添加到HashSet

下面是代码-

/* (non-Javadoc)
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if( this == obj) {
        return true;
    }
    if( null == obj || getClass() != obj.getClass()) {
        return false;
    }

    Pojo rest = (Pojo) obj;
    return field1.equals(rest.field1) && field2.equals(rest.field2) && field3.equals(rest.field3); 
}

/* (non-Javadoc)
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode() {
    return Objects.hash(field1, field2, field3);
}

Set<Pojo> pathSet = new HashSet<>();
//Iterate over list and construct pojo object here
Pojo pojo = new Pojo(value1, value2, value3)
pathSet.add(pojo)

谢谢