Guava Splitter для создания в виде карты с заданным значением - PullRequest
0 голосов
/ 11 декабря 2018

Как лучше всего преобразовать приведенную ниже строку в Map <Key, Set<String>>, используя Guava 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 голосов
/ 12 декабря 2018

Ваш подход в основном правильный, в Splitter Guava нет API для синтаксического анализа значений определенным образом, поэтому вам придется выполнять итерацию дважды (если вы не решите сбросить MapSplitter и просто использовать Splitter с вашими собственными значениями, анализируемыми вцикл).

Тем не менее, есть удобная коллекция ala Map<Foo, Collection<Bar>>, которая Multimap - в вашем случае SetMultimap (предпочтительно ImmutableSetMultimap), напр .: * 10101

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]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...