繁体   English   中英

如何使用Java Stream API使用字符串解析数组

[英]How to parse an array with strings using Java Stream API

如何使用Java流API从具有两个不同定界符的字符串数组中解析和创建哈希图。

我有以下数组

String[] domaintCount = new String[]{  "900, google.com",
                                          "400, mobile.yahoo.co.uk",
                                           "100, mobile.amazon.com",
                                           "100, samsung.com"
                                            } ; 

我想创建一个哈希图,每个单词作为键,数字作为值。

google ,900,
com ,900,
mobile,400

等等。我想使用Stream API函数来做到这一点。

我做了这样的事情。 基本思想是将字符串拆分为<domain, number>映射,然后合并这些映射的值。

public static void main(String[] args) {
    String[] domaintCount = new String[]
    {
            "900, google.com",
            "400, mobile.yahoo.co.uk",
            "100, mobile.amazon.com",
            "100, samsung.com"
    };

    Function<String, Map<String, String>> stringParser = string -> {
        String[] splitByComma = string.split(", ");
        String num = splitByComma[0];
        String[] domains = splitByComma[1].trim().split("\\.");
        Map<String, String> stringStringHashMap = new HashMap<>();
        for (String dom : domains) {
            stringStringHashMap.put(dom, num);
        }
        return stringStringHashMap;
    };

    Map<String, String> collect = Stream.of(domaintCount)
            .map(stringParser)
            .map(Map::entrySet)
            .flatMap(Set::stream)
            .collect(groupingBy(Map.Entry::getValue))
            .values().stream()
            .flatMap(List::stream)
            .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1));

    System.out.println(collect);
}

我将拆分然后收集到地图中。 对于您的简单情况,我直接使用了Java的SimpleEntry。 如果您的结果更复杂,那么我会创建一个pojo:

Map<String, Double> yourMap = Arrays.stream(domaintCount)
    .map(string -> {
      String[] splitted = string.split(",");
      return new AbstractMap.SimpleEntry<String, Double>(splitted[1].trim(), Double.valueOf(splitted[0].trim()));
    })
    .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));

这样,您也可以使用“,”和“,”。

Stream.of(domainCount)
.map(str->str.split(", "))
.collect(toMap(strArr->strArr[0].trim(), strArr->strArr[1].trim());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM