如何将两个zip两个设置为Java中的地图

时间:2016-12-21 07:24:46

标签: java set

我有一套A:

[{name: a,value: 10},
 {name: b,value: 11}]

和Set B:

[{name: a,value: 100},
 {name: b,value: 110}]

然后,我想要获得Map C:

{{name: a,value: 10}:{name: a,value: 100},
 {name: b,value: 11}:{name: b,value: 110}}

密钥和Map C中每个条目的值是相等的,这意味着密钥和值具有相同的名称",通过不同的"值" s。 我发现番石榴套装很有用,但缺乏这样的功能。

我知道这是一种方法:

public static <T> Map<T, T> zip(Set<T> s1, Set<T> s2) {
    Map<T, T> map = new HashMap<>();
    for (T e1 : s1) {
        for (T e2 : s2) {
            if (e1.equals(e2)) {
                map.put(e1, e2);
                break;
            }
        }
    }
    return map;
}

有没有方便的方法在Java中压缩两个集?

2 个答案:

答案 0 :(得分:1)

你可以尝试这个,因为这可以用字段name

覆盖equals和hashcode
public static <T> Map<T, T> zip(Set<T> s1, Set<T> s2) {
    return s1.stream()
             .filter(s2::contains)
             .collect(Collectors.toMap(k -> k, v -> s2.stream().filter(s -> s.equals(v)).findFirst().get()));
}

答案 1 :(得分:-1)

您指定的实现具有复杂度O(n ^ 2)。您可以将其写为O(n),如下所示:

public static <T> Map<T, T> zip(Set<T> s1, Set<T> s2) {
    Map<T, T> map = new HashMap<>();
    for (T e1 : s1) {
      T e2 = s2.get(e1) {
         if (e1.equals(e2)) {
            map.put(e1, e2);
            break;
        }
    }
    return map;
}

这是O(n)因为get()使用散列来查找元素。为了使其正常工作,您需要为hashCode()传递的实际类型实现equals()T才能正常运行:

class Actual {
  private String name;
  private String value;
  ...
  public int hashCode() { 
    return name.hashCode()
  }
  public boolean equals(Object o) {
    if (!(o instanceof Actual)) {
      return false;
    }
    Actual other = (Actual)o;
    return name.equals(other.name);
  } 
}