簡體   English   中英

兩個如何將兩個集合壓縮到Java中的映射中

[英]How two zip two sets into a map in Java

我有一套A:

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

並設置B:

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

然后,我想獲取地圖C:

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

映射C中每個條目的鍵和值相等,這意味着鍵和值通過不同的“值”具有相同的“名稱”。 我發現番石榴的Sets是有用的,但是缺少這種功能。

我知道這是做到這一點的一種方法:

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壓縮兩個集合嗎?

您可以嘗試執行此操作,以使其覆蓋字段name和等於

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()));
}

您指定的實現的復雜度為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()使用散列來查找元素。 為了使其正常工作,您需要為傳遞為T的實際類型實現hashCode()equals() ,以使其正常工作:

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);
  } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM