Guava Splitter 生成具有设定值的地图
Guava Splitter to produce as map with set value
使用 Guava Splitter
将下面的字符串转换为 Map <Key, Set<String>>
的最佳方法是什么?
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
这是我尝试过的方法:
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
Map<String, Set<String>> pairMap = new HashMap<String, Set<String>>();
Map<String, String> map = Splitter.on(';')
.withKeyValueSeparator(':')
.split(pairs);
map.forEach((key, value) -> {
pairMap.put(key, Splitter.on(',').splitToList(value).stream().collect(Collectors.toSet()));
});
pairMap.forEach((key, valueSet) ->{
System.out.println("key: "+key);
valueSet.forEach(value ->{
System.out.println(value);
});
});
你的方法大部分是正确的,Guava 的 Splitter 中没有 API 以特定方式解析值,所以你必须迭代两次(除非你决定删除 MapSplitter
并只使用 Splitter
用你自己的值在循环中解析)。
就是说,有方便的集合 ala Map<Foo, Collection<Bar>>
,即 Multimap
-- in your case SetMultimap
(preferably ImmutableSetMultimap
),例如:
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
Map<String, String> map = Splitter.on(';')
.withKeyValueSeparator(':')
.split(pairs);
ImmutableSetMultimap<String, String> pairMap = map.entrySet().stream()
.collect(ImmutableSetMultimap.flatteningToImmutableSetMultimap(
Map.Entry::getKey,
e -> Streams.stream(Splitter.on(',').split(e.getValue()))));
System.out.println(pairMap);
// {cat=[01, 02, 03], dog=[AA, BB, CC], fish=[A1, A2]}
使用 Guava Splitter
将下面的字符串转换为 Map <Key, Set<String>>
的最佳方法是什么?
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
这是我尝试过的方法:
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
Map<String, Set<String>> pairMap = new HashMap<String, Set<String>>();
Map<String, String> map = Splitter.on(';')
.withKeyValueSeparator(':')
.split(pairs);
map.forEach((key, value) -> {
pairMap.put(key, Splitter.on(',').splitToList(value).stream().collect(Collectors.toSet()));
});
pairMap.forEach((key, valueSet) ->{
System.out.println("key: "+key);
valueSet.forEach(value ->{
System.out.println(value);
});
});
你的方法大部分是正确的,Guava 的 Splitter 中没有 API 以特定方式解析值,所以你必须迭代两次(除非你决定删除 MapSplitter
并只使用 Splitter
用你自己的值在循环中解析)。
就是说,有方便的集合 ala Map<Foo, Collection<Bar>>
,即 Multimap
-- in your case SetMultimap
(preferably ImmutableSetMultimap
),例如:
String pairs = "cat:01,02,03;dog:AA,BB,CC;fish:A1,A2";
Map<String, String> map = Splitter.on(';')
.withKeyValueSeparator(':')
.split(pairs);
ImmutableSetMultimap<String, String> pairMap = map.entrySet().stream()
.collect(ImmutableSetMultimap.flatteningToImmutableSetMultimap(
Map.Entry::getKey,
e -> Streams.stream(Splitter.on(',').split(e.getValue()))));
System.out.println(pairMap);
// {cat=[01, 02, 03], dog=[AA, BB, CC], fish=[A1, A2]}