java - 从原始列表中创建所有重复项的单独列表

标签 java algorithm duplicates

我有一个对象列表。这些对象中的每一个都有一个 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/

相关文章:

算法树或植物生长背后的算法

sql - 选择具有优先级值的非重复行

java - C# 和 Java 控制台编码和 PowerShell

algorithm - 计算三种不同排列中相同有序对的数量

c# - 什么是基于规则的算法?

MySQL 删除两个字段匹配的重复项

添加重复项时引发异常的 .NET 集合

java - Objective C 中的确定性洗牌

java - Spring-security 甚至在提交表单之前就显示 'Bad Credentials'

java - 调试可能存在内存泄漏的tomcat应用程序