【问题标题】:Data handling of HashMultimapHashMultimap的数据处理
【发布时间】:2021-12-31 02:02:55
【问题描述】:

我有一个 HashMultimap

Multimap<String, String> map = HashMultimap.create();

我放入地图的数据是

map.put("cpu", "i9");
map.put("hang", "MSI");
map.put("hang", "DELL");
map.put("hang", "DELL");
map.put("cpu", "i5");
map.put("hang", "HP");
map.put("cpu", "i7");

我有一个流

String joinString = map.entries().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining(" OR "));

我需要输出是

(hang=HP OR hang=MSI OR hang=DELL) AND (cpu=i9 OR cpu=i5 OR cpu=i7)

我需要一个AND 在键之间。我该怎么做?

【问题讨论】:

  • "非常感谢您的指示" - 这是我的指示。 1) 阅读 Joiner 类的 javadoc。 2)如果你不知道如何用流来做到这一点,请改用经典的Java;例如一个循环,StringBuilder.append 等等。 3) 请不要将 StackOverflow 视为免费的代码编写服务。向我们展示您解决问题的(真正)尝试。

标签: java java-stream guava multimap


【解决方案1】:

使用地图视图:

String joined = map.asMap()
        .entrySet()
        .stream()
        .map(e -> e.getValue()
                .stream()
                .map(v -> e.getKey() + "=" + v)
                .collect(Collectors.joining(" OR ", "(", ")")))
        .collect(Collectors.joining(" AND "));

【讨论】:

    【解决方案2】:

    当然 schmosel 打败了我,但这里的 api/用法略有不同:

    String joined = map.keySet() // keySet() instead of asMap()
      .stream().map(k
        -> String.format( // string.format instead of concatenation ;)
            "(%s)",
            map.get(k).stream() // map.get(k) instead of e.getValue()
                .map(v
                    -> String.format("%s=%s", k, v))
                .collect(Collectors.joining(" OR "))
           )
      ).collect(Collectors.joining(" AND "));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多