如何使用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函数。
答案 0 :(得分:1)
我做了这样的事情。基本思想是将字符串拆分为<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);
}
答案 1 :(得分:0)
我将拆分然后收集到地图中。对于您的简单情况,我直接使用了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));
答案 2 :(得分:0)
这样,您也可以使用“,”和“,”。
Stream.of(domainCount)
.map(str->str.split(", "))
.collect(toMap(strArr->strArr[0].trim(), strArr->strArr[1].trim());