[英]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.