代码之家  ›  专栏  ›  技术社区  ›  Naveen qamnott

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

  •  -1
  • Naveen qamnott  · 技术社区  · 7 年前

    将下面的字符串转换为字符串的最佳方法是什么 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 回复  |  直到 7 年前
        1
  •  2
  •   Grzegorz Rożniecki    7 年前

    您的方法基本上是正确的,Guava的拆分器中没有API以特定的方式解析值,因此您必须迭代两次(除非您决定放弃) MapSplitter 只要使用 Splitter

    也就是说,这里有方便的收藏 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]}
    
    推荐文章