按元素计算列表的大小

nat*_*nco 5 java collections

我想按元素计算列表的大小。例如,

List<String> source = Arrays.asList("USA", "USA", "Japan", "China", "China", "USA", "USA");
Run Code Online (Sandbox Code Playgroud)

我想从此源创建对象(地图),例如,

int usa_count = result.get("USA").intValue(); // == 4
int javan_count = result.get("Japan").intValue(); // == 1
int china_count = result.get("China").intValue(); // == 2
int uk_count = result.get("UK").intValue(); // == 0 or NPE (both OK)
Run Code Online (Sandbox Code Playgroud)

现在,我写了下面的内容。

Map<String, Integer> result = new HashMap<>();
for (String str : source) {
    Integer i = result.getOrDefault(str, Integer.valueOf(0));
    result.put(str, i + 1);
}
Run Code Online (Sandbox Code Playgroud)

虽然,这足以达到我的目的,但我认为这不是优雅的代码,我想成为一名优雅的编码员。我用的是Java8。有没有优雅的解决方案来代替我的解决方案?

Cha*_*ara 3

采集时可以使用频数法。

int usa_count = Collections.frequency(source, "USA");
int javan_count = Collections.frequency(source, "Japan");
int china_count = Collections.frequency(source, "CHINA"); 
int uk_count = Collections.frequency(source, "UK");
Run Code Online (Sandbox Code Playgroud)

请参阅: https: //www.tutorialspoint.com/java/util/collections_Frequency.htm

在Java 8中:-

groupingBy 收集器允许将具有相同分类的元素分组到一个映射中。

Map<String, Long> countContries = source.stream().collect(Collectors.groupingBy(Function.identity() , Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

请参阅:https ://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html

https://www.mkyong.com/java8/java-8-collectors-groupingby-and-mapping-example/

  • 但这不会构建地图...... (3认同)