哪个 Java Collection 类更适合对对象列表进行分组?
我有一个来自如下用户的消息列表:
aaa hi
bbb hello
ccc Gm
aaa Can?
CCC yes
ddd No
我想从这个消息对象列表中计算并显示aaa(2)+bbb(1)+ccc(2)+ddd(1)
。有代码帮助吗?
最佳答案
您可以使用 Map<String, Integer>
其中键代表各个字符串,映射值是每个字符串的计数器。
所以你可以这样做:
// where ever your input comes from: turn it into lower case,
// so that "ccc" and "CCC" go for the same counter
String item = userinput.toLowerCase();
// as you want a sorted list of keys, you should use a TreeMap
Map<String, Integer> stringsWithCount = new TreeMap<>();
for (String item : str) {
if (stringsWithCount.contains(item)) {
stringsWithCount.put(item, stringsWithCount.get(item)+1));
} else {
stringsWithCount.put(item, 0);
}
}
然后您可以在完成后迭代 map :
for (Entry<String, Integer> entry : stringsWithCount.entrySet()) {
并构建您的结果字符串。
这就像老派的实现;如果你想给老师一个惊喜,你可以选择 Java8/lambda/stream 解决方案。 (除非您真的花时间完全理解以下解决方案,否则我不建议这样做;因为这在我这边未经测试)
Arrays.stream(someListOrArrayContainingItems)
.collect(Collectors
.groupingBy(s -> s, TreeMap::new, Collectors.counting()))
.entrySet()
.stream()
.flatMap(e -> Stream.of(e.getKey(), String.valueOf(e.getValue())))
.collect(Collectors.joining())
关于java - 使用 Java 集合对对象列表进行分组和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39201942/