java - 使用 Java 集合对对象列表进行分组和计数

标签 java collections count grouping

哪个 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/

相关文章:

scala - 避免 Scala 中的循环

xml - 如何使用 JAXB 解码根元素的集合?

matlab - 如何计算矩阵中给定值的元素数量?

c - Arduino Due C 定时器编码(中断计数)

java - 扩展类而不覆盖任何内容 : Bad practice?

java - 适合有抱负的 Java 技术架构师的好网站

java - Google map 中的空白方 block

java - Appium:如何在appium中搜索后点击第一个链接

c# - C# 中是否有支持故障安全迭代的良好 IList 和 IDictionary 实现?

oracle - 使用 COUNT(*) 和 INTO oracle sql