在java中从多个列表中获取所有重复的值

wr98u20j  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(483)

我想从多个整数列表中获取所有重复的值。令人困惑的是,这些整数列表在一个Map的Map中,就像这个linkedhashmap<string,linkedhashmap<string,list>>流

// sample value
{
    break_desc100=
    {
        bDesc_1000=[62, 72, 82, 92, 102, 112, 122], 
        bDesc 1001=[180, 190, 200, 210, 220, 230, 240], 
        cMessage_1000=[112], 
        cMessage_1001=[232]
    }
}
// for this one I want to get 112

到目前为止,我尝试使用retainall,但如果具有duplicate的列表彼此不相邻,我的代码就无法工作。

for (Map.Entry<String,LinkedHashMap<String,List<Integer>>> entry : streams.entrySet()) {
     String currentStream = entry.getKey();
     LinkedHashMap<String,List<Integer>> bDescList = entry.getValue();
     for (Map.Entry<String,List<Integer>> bDesc : bDescList.entrySet()) {
          if (firstIteration) {
              prevBDesc = bDesc;
              firstIteration = false;
          } else {
              List<Integer> currentList = prevBDesc.getValue();
              List<Integer> nextList = bDesc.getValue();
              duplicates = new ArrayList<Integer>(currentList);
              duplicates.retainAll(nextList);
              allDuplicates.addAll(duplicates); //Set<Integer>
              prevBDesc = bDesc;
          }
     }
}

编辑:抱歉,伙计们,我忘了补充一下,它是在Java1.5上运行的。

vptzau2j

vptzau2j1#

这似乎是一个适合流的任务:

Map<Integer, Long> counts = streams.values().stream()
       .flatMap(bDescList -> bDescList.values().stream())
       .flatMap(nextList -> nextList.stream())
       .collect(Collectors.groupingBy(
                Function.identity(), 
                Collectors.counting()));

counts.values().removeIf(c -> c == 1L);

Set<Integer> duplicates = counts.keySet();

这段代码首先创建一个计数Map。为此,它首先流化外部Map的值,然后使用 Stream.flatMap 创建一个包含所有内部Map值的新流。因为这些值实际上是列表,所以我们需要使用 Stream.flatMap 再一次,终于得到一股 Integer . (我把变量名从你的问题中排除了)。
我们收集到一个计数Map,其中键是所有内部Map列表值中的数字,值是这些数字中每一个的计数,包括所有Map和列表。
然后,我们从countsMap中删除值为的所有条目 1 . 其余的键是重复的数字。
编辑:这里是Java5中的等效代码???

Map<Integer, Long> counts = new HashMap<Integer, Long>();

for (Map<String, List<Integer>> bDescList : streams.values()) {
    for (List<Integer> bDesc : bDescList.values()) {
        for (Integer n : bDesc) {
            Long c = counts.get(n);
            if (c == null) {
                c = 0L;
            }
            counts.put(n, c + 1);
        }
    }
}

Iterator<Long> it = counts.values().iterator();
while (it.hasNext()) {
    Long c = it.next();
    if (c == 1L) {
        it.remove();
    }
}

Set<Integer> duplicates = counts.keySet();

这里的道理完全一样。。。我们通过迭代列表Map来创建计数Map,然后删除计数为1的条目,剩下的键是重复的。

x4shl7ld

x4shl7ld2#

编辑

这假设您正在查找任何重复的值。这包括在同一列表中查找重复项。如果我误解了这个问题,请纠正我。
您可以在o(n)时间和o(n)空间中执行此操作,方法是遍历嵌套哈希,同时计算每个整数的出现次数。然后我们就可以过滤出不止一次出现的整数。

Map<String, List<Integer>> innerMap = new HashMap<>();
innerMap.put("bDesc_1000", Arrays.asList(62, 72, 82, 92, 102, 112, 122));
innerMap.put("bDesc_1001", Arrays.asList(180, 190, 200, 210, 220, 230, 240));
innerMap.put("cMessage_1000", Collections.singletonList(112));
innerMap.put("cMessage_1001", Collections.singletonList(232));

Map<String, Map<String, List<Integer>>> map = new HashMap<>();
map.put("break_desc100", innerMap);

Map<Integer, Integer> occurrenceMap = new HashMap<>();
map.forEach((outerKey, outerValue) -> {
    outerValue.forEach((innerKey, innerValue) -> {
        innerValue.forEach((element -> occurrenceMap.merge(element, 1, Integer::sum)
        ));
    });
});

List<Integer> duplicates = occurrenceMap.entrySet().stream()
        .filter(e -> e.getValue() > 1)
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
System.out.println(duplicates);

输出

[112]

相关问题