2010-02-03 72 views
2

我有一个List<HashMap<String,Object>>它代表一个数据库,其中每个列表记录是一个数据库行。从HashMap条目列表中删除重复项

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

什么是有效的方法?

仅供参考 - 我无法在查询数据库时执行截然不同的操作,因为在加载数据库后,GroupName稍后会添加到Map。由于Id列不是主键,所以一旦将GroupName添加到Map。你将有基于Id + GroupName组合的重复项!

希望我的问题有道理。让我知道如果我们需要更多的澄清。

+0

问题:哪些需要删除,哪些需要保留? – BalusC 2010-02-03 21:12:32

+0

为什么你在第一个地方插入重复项?我的意思是,为什么不在插入时检查重复项? – 3lectrologos 2010-02-03 21:20:32

+0

我已经在我的问题中给出了原因。HashMap中的值在从数据库初始加载后更新。因此,我可以首先应用重复条件的原因。 – jagamot 2010-02-03 21:37:40

回答

3
  1. 创建比较HashMaps这样一比较,并通过比较你所感兴趣的键/值对它们进行比较
  2. 使用Collections.sort(yourlist, yourcomparator)
  3. 现在,所有基于比较器彼此相似的地图在列表中都相邻。
  4. 创建一个新列表。
  5. 遍历你的第一个列表,跟踪你上次看到的内容。如果当前值与上次不同,请将其添加到新列表中。
  6. 根据比较器,您的新列表不应该包含重复项。

遍历列表的代价是O(n)。排序是O(n log n)。所以这个算法是O(n log n)。

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

+0

我希望这个解决方案也是有效的,即使我的列表超过1百万行! – jagamot 2010-02-03 21:46:09

+1

值得注意的是,对于大多数集合,包括HashMap,您可以简单地移除()重复的对象。使用HashMap,您将密钥传递给remove()。所以你不需要重复的List或Map。 – jonescb 2010-02-03 21:51:02

+4

Java内存中有100万行是什么?你为什么实际上在Java的内存中复制数据库?我认为这个问题需要在别的地方解决。只需在数据库中更新,而不是在Java内存中进行更新,并利用约束来防止重复。 – BalusC 2010-02-03 22:10:00

1

我已经迈出了Employee类 与整型,Employee对象为键值对创建地图 这里是我的地图

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

Employee类bean类,它具有类似名称,ID属性,指定; 地图允许唯一的密钥。但如果您不想在地图中允许重复值 ,则必须在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; 
} 

,并同时增加键值,以地图,你必须使用含有方法

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

containsValue内部调用equals()方法,因此你在骑equals方法 它会检查每一个值(对象)与先前的对象,如果散列码相同 它返回true意味着两者都是相同的对象。