我有一个集合,我想将其转换为map,以便稍后在guava的Maps.difference()
中使用它。我只关心差异中的关键
想出了这个版本:
private <T> Map<T, T> toMap(Set<T> set) {
return set.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
}
但是,我知道通常,一个集合有一个map的支持字段。这是我用来创建地图的方法:
public static <E> Set<E> newConcurrentHashSet() {
return Collections.newSetFromMap(new ConcurrentHashMap<E, Boolean>());
}
因为我只需要我想的钥匙,所以我可以以某种方式获得这个领域的视图。任何想法?
答案 0 :(得分:8)
我最终得到了一个相当简单的Java 8系统解决方案,如下所示:
Map<String, Foo> map = fooSet.stream().collect(Collectors.toMap(Foo::getKey, e -> e));
Set<Foo> fooSet
getKey
的getter,它返回一个String 答案 1 :(得分:3)
您可以将url = urlopen("http://www.test.com/file.zip")
zipfile = ZipFile(StringIO(url.read()))
转换为Set
(相同的键和值来自Map
的元素),如下所示:
Set
答案 2 :(得分:1)
来自comment:
我想知道哪些项目只在左边,哪些只在右边,哪个是共同的(类似于地图差异)
使用removeAll()
和[retainAll()][3]
。
示例:
Set<Integer> set1 = new HashSet<>(Arrays.asList(1,3,5,7,9));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3,4,5,6,7));
Set<Integer> onlyIn1 = new HashSet<>(set1);
onlyIn1.removeAll(set2);
Set<Integer> onlyIn2 = new HashSet<>(set2);
onlyIn2.removeAll(set1);
Set<Integer> inBoth = new HashSet<>(set1);
inBoth.retainAll(set2);
System.out.println("set1: " + set1);
System.out.println("set2: " + set2);
System.out.println("onlyIn1: " + onlyIn1);
System.out.println("onlyIn2: " + onlyIn2);
System.out.println("inBoth : " + inBoth);
输出
set1: [1, 3, 5, 7, 9]
set2: [3, 4, 5, 6, 7]
onlyIn1: [1, 9]
onlyIn2: [4, 6]
inBoth : [3, 5, 7]
现在,如果你想知道所有的值以及它们的位置,你可以这样做(Java 8):
Set<Integer> setA = new HashSet<>(Arrays.asList(1,3,5,7,9));
Set<Integer> setB = new HashSet<>(Arrays.asList(3,4,5,6,7));
Map<Integer, String> map = new HashMap<>();
for (Integer i : setA)
map.put(i, "In A");
for (Integer i : setB)
map.compute(i, (k, v) -> (v == null ? "In B" : "In Both"));
System.out.println("setA: " + setA);
System.out.println("setB: " + setB);
map.entrySet().stream().forEach(System.out::println);
输出
setA: [1, 3, 5, 7, 9]
setB: [3, 4, 5, 6, 7]
1=In A
3=In Both
4=In B
5=In Both
6=In B
7=In Both
9=In A
答案 3 :(得分:0)
查看类似的答案here。
假设您的原始集合是一组值(原始数据中没有键!),您需要为新创建的地图指定键。番石榴Maps.uniqueIndex
可能会有所帮助(见here)
否则,如果原始集是您要保留的一组键(原始数据中没有值!),则需要为新创建的映射指定默认值或特定值。番石榴Maps.toMap
在这里可能会有所帮助。 (查看更多here)
答案 4 :(得分:0)
developer的答案的改进:
.flights__types
max-width: 1120px
margin: 30px auto
&__title
font-size: 22px
font-weight: bold
&__container
width: 100%
display: flex
flex-direction: row
justify-content: space-between
flex-wrap: wrap
margin-top: 13px
+r(1439)
margin-top: 23px
.flight__item__companies,
.flight__item__direct-flights,
.flight__item__air-alliances,
.flight__item__transplantation,
.flight__item__types-of-aircraft,
.flight__item__airports
width: 45%
padding: 19px 20px 0px 20px
background-color: #ffffff
margin-top: 30px
height: auto
.title
font-size: 18px
font-weight: bold
.decript
margin-top: 3px
font-size: 14px
+r(767)
margin-top: 4px
.flight__item__companies,
.flight__item__direct-flights
margin-top: 0
或者如果您静态导入Map<String, Foo> map = fooSet.stream().collect(Collectors.toMap(Foo::getKey, Function.identity()));
和Collectors.toMap
:
Function.identity