使用番石榴Map <Key, Set<String>>
将下面的字符串转换为Splitter
的最佳方法是什么?
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);
});
});
答案 0 :(得分:1)
您的方法基本上是正确的,Guava的Splitter中没有API可以以特定的方式解析值,因此您必须进行两次迭代(除非您决定丢弃MapSplitter
并仅将Splitter
与自己的值循环解析)。
也就是说,有一个方便的集合ala Map<Foo, Collection<Bar>>
,它是Multimap
-在您的情况下为SetMultimap
(最好是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]}