我有一个对象列表。这些对象中的每一个都有一个 boolean 重复变量。在我的算法结束时,我希望所有不止一个的对象(由对象上的字符串标识符标识的重复项)都具有 boolean 重复 = true。我已经这样做了,但我想知道是否有一种方法可以更有效地做到这一点,最好只用一个循环。
List<String> dupIds = new ArrayList<String>();
Map<String, MyObject> objMap = new HashMap<String, MyObject>();
for (MyObject o : objectList) {
if (objMap.containsKey(o.getId()) {
dupIds.add(o.getId());
} else {
objMap.put(o.getId(), o);
}
}
for (MyObject o : objectList) {
if (dupIds.contains(o.getId) {
o.setDuplicate(true);
}
}
希望这不是一个重复的问题,但我发现的大多数问题并没有完全做到这一点,通常只是删除重复项(我需要保留它们)或只标记副本(我需要标记副本加上原件)。
最佳答案
这不是最有效的方法,但它摆脱了第二个循环:
Map<String, MyObject> objMap = new HashMap<String, MyObject>();
for (MyObject o : objectList) {
if (objMap.containsKey(o.getId()) {
objMap.get(o.getId()).setDuplicate(true);
o.setDuplicate(true);
} else {
objMap.put(o.getId(), o);
}
}
当您在 map 中找到重复项时,您会将当前对象和 map 中的对象都标记为重复项。如果一个对象出现两次以上,你可以调用 setDuplicate
多次在同一对象上,因此您可能需要在设置标志之前检查标志是否已设置。
更新:
这是一个不会调用 setDuplicate
的解决方案在同一个对象上多次:
Map<String, MyObject> objMap = new HashMap<String, MyObject>();
for (MyObject o : objectList) {
if (objMap.containsKey(o.getId()) {
MyObject other = objMap.get(o.getId());
if (other != null) {
othet.setDuplicate(true);
objMap.put(o.getId(), null);
}
o.setDuplicate(true);
} else {
objMap.put(o.getId(), o);
}
}
- 当你第一次遇到一个物体时,你把它放在 map 上。
- 当你第二次遇到一个物体时,你
setDuplicate
到当前对象和 map 中的对象,然后将 null 作为对象在 map 中的 ID 的值。 - 当你第 3 次(或更多次)遇到一个物体时,你只会
setDuplicate
到当前对象。
关于java - 从原始列表中创建所有重复项的单独列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289608/