查找包含至少n个与另一个键共同的元素的键,包含列表

kan*_*ri3 9 java linkedhashmap java-8

我有一个LinkedHashMap<String, List<T>>.我正在构建Map,所以也许有更好的方法来组织所有数据.

我试图获得具有共同列表的键,每个列表中至少有2个共同元素.

例如:

Map
----------------------
| Key | Values       |
----------------------
| M1  | [A1, A3]     |
| M2  | [A1, A2, A3] |
| M3  | [A1, A2]     |
| M4  | [A2, A3]     |
----------------------
Run Code Online (Sandbox Code Playgroud)

最后,我想有这个清单: [ [M2, M3], [M2, M4], [M1, M2] ]

  • M2和M3包含A1和A2
  • M2和M4包含A2和A3
  • M1和M2包含A1和A3

我不知道如何将我的第一个条目的值与所有其他条目的值进行比较.依此类推,直到我到达地图的末尾(就像for列表的双循环一样).

我现在的解决方案(但我觉得可能有更好的方法)

List<String> keyList = new ArrayList<>(myMap.keySet());
for(int i = 0 ; i < keyList.size()-1 ; i++) {
    String keyA = keyList.get(i);
    List<T> valuesA = myMap.get(keyA);

    for(int j = 1 ; j < keyList.size() ; j++) {
        String keyB = keyList.get(j);
        List<T> valuesB = myMap.get(keyB);

        // compare both lists here
    }
}
Run Code Online (Sandbox Code Playgroud)

使用地图的方式去?

现在,性能不是问题.但是让事情变得更顺畅总是会更好

Ama*_*bra 0

您可以使用以下方法

1)迭代映射中每个键的值(这将是一个列表)

2)从上面迭代的下一个索引开始另一个迭代,直到结束

3)对于#1列表中的每个元素,使用 contains 方法检查它是否在#2列表中

a) Finish iterating list #3 as soon as two identical objects are found 

b) Iterate list in #3 till last but one if no element one

c) Iterate list in #3 till last if one element found
Run Code Online (Sandbox Code Playgroud)

希望对您有帮助