我有一个List<HashMap<String,Object>>
代表一个数据库,其中每个列表记录都是数据库行。
我的数据库中有10列。有两行,其中2个特定列的值等于。在使用数据库中的所有行更新列表后,我需要从列表中删除重复项。
什么是有效的方式?
仅供参考 - 我在查询数据库时无法做到明显,因为在加载数据库后,GroupName会在稍后阶段添加到Map
。并且,由于Id列不是主键,因此将GroupName添加到Map
后。您将拥有基于Id + GroupName组合的重复项!
希望我的问题有道理。如果我们需要更多澄清,请告诉我。
答案 0 :(得分:3)
Collections.sort(yourlist, yourcomparator)
; 迭代列表的成本是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)
经过多次搜索,我的状况一直相同,最后下面的解决方案对我有用。
Objects.hash(filed1, field2, ...)
; 下面是代码-
/* (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)
谢谢