在与另一个地图的值进行比较时,如何使地图的值空白?

时间:2019-02-27 21:17:04

标签: java list hashmap linkedhashmap

假设我有两个地图region1,region2,并且都声明为

LinkedHashMap<String, List<String>> region1 = new LinkedHashMap<>();

LinkedHashMap<String, List<String>> region2 = new LinkedHashMap<>();

region1包含以下值:

region1 : {R1 = [A, B, C, D]}

region2包含以下值:

region2 : {R2 = [G, A, D, B]}

将region1的值视为基本值,然后对region2的值进行迭代,并且必须将非重复值放置在另一个具有region2键和region2的非重复值的映射中。

因此地图region3包含

region3 : {R2 = [G]}

然后我们在另一个地图上迭代region3,以比较匹配值

map1 : {1 = [G, C]}

由于该值存在匹配项,因此我们需要在匹配的值中添加一个空格。

因此map1包含值

map1 : {1=[  , C]}

2 个答案:

答案 0 :(得分:0)

编辑:已优化。
Stream。原始对象未修改。
但是有点长。

final Map<String, List<String>> region1 = new LinkedHashMap<>();
region1.put("R1", new ArrayList<>(Arrays.asList("A", "B", "C", "D")));

final Map<String, List<String>> region2 = new LinkedHashMap<>();
region2.put("R2", new ArrayList<>(Arrays.asList("A", "G", "C", "B")));
region2.put("R3", new ArrayList<>(Arrays.asList("A", "G", "C", "B")));

final Stream<Entry<String, List<String>>> entries =
        region1.values()
               .stream()
               .flatMap(values ->
                       region2.entrySet()
                              .stream()
                              .map(e -> {
                                  final List<String> value =
                                          e.getValue()
                                           .stream()
                                           .filter(v -> !values.contains(v))
                                           .collect(toList());
                                  return new SimpleEntry<>(e.getKey(), value);
                              })
               );

final Map<String, List<String>> result = entries.collect(toMap(Entry::getKey, Entry::getValue));

这就是为什么我喜欢Stream s。使用类型推断Java 10+),它甚至更干净。

答案 1 :(得分:0)

无需使用流,您可以通过以下方式解决它:

public static void main(String[] args) {

    // setup the input and output maps
    LinkedHashMap<String, List<String>> region1 = new LinkedHashMap<>();
    LinkedHashMap<String, List<String>> region2 = new LinkedHashMap<>();
    LinkedHashMap<String, List<String>> region3 = new LinkedHashMap<>();
    region1.put("R1", asList("A", "B", "C", "D"));
    region2.put("R2", asList("G", "A", "D", "B"));

    // for each key in region2
    for(String key : region2.keySet()) {

        // make a copy of the values for that key
        List<String> values = new ArrayList<>(region2.get(key));

        // remove all the duplicates from each of the lists in region1
        for (List<String> baseValues : region1.values()) {
            values.removeAll(baseValues);
        }

        // if there are any remaining list values
        if (values.size() > 0) {
            // put them into region3
            region3.put(key, values);
        }
    }

    System.out.println(region3);
}