我想从多个整数列表中获取所有重复的值。令人困惑的是,这些整数列表在一个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上运行的。
2条答案
按热度按时间vptzau2j1#
这似乎是一个适合流的任务:
这段代码首先创建一个计数Map。为此,它首先流化外部Map的值,然后使用
Stream.flatMap
创建一个包含所有内部Map值的新流。因为这些值实际上是列表,所以我们需要使用Stream.flatMap
再一次,终于得到一股Integer
. (我把变量名从你的问题中排除了)。我们收集到一个计数Map,其中键是所有内部Map列表值中的数字,值是这些数字中每一个的计数,包括所有Map和列表。
然后,我们从countsMap中删除值为的所有条目
1
. 其余的键是重复的数字。编辑:这里是Java5中的等效代码???
这里的道理完全一样。。。我们通过迭代列表Map来创建计数Map,然后删除计数为1的条目,剩下的键是重复的。
x4shl7ld2#
编辑
这假设您正在查找任何重复的值。这包括在同一列表中查找重复项。如果我误解了这个问题,请纠正我。
您可以在o(n)时间和o(n)空间中执行此操作,方法是遍历嵌套哈希,同时计算每个整数的出现次数。然后我们就可以过滤出不止一次出现的整数。
输出