番石榴分配器,可生成具有设定值的地图

时间:2018-12-11 18:14:17

标签: guava

使用番石榴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);
    });
});

1 个答案:

答案 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]}
相关问题