按元素计算List的大小

时间:2016-12-02 08:16:01

标签: java collections

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

List<String> source = Arrays.asList("USA", "USA", "Japan", "China", "China", "USA", "USA");

我想从这个来源创建对象(Map),例如,

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)

现在,我在下面写了。

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

虽然这对我的目的来说已经足够了,但我觉得这不是优雅的代码,我想成为一个优雅的编码器。 我使用Java8。 有没有优雅的解决方案而不是我的解决方案?

4 个答案:

答案 0 :(得分:2)

您可以在收集中使用频率方法。

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");

参见:https://www.tutorialspoint.com/java/util/collections_frequency.htm

Java 8 中的

: -

groupingBy collector允许将具有相同分类的元素组合到一个地图中。

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

参考: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/

答案 1 :(得分:2)

您可以使用流groupingBy,如下所示:

List<String> source = Arrays.asList("USA", "USA", "Japan", 
        "China", "China", "USA", "USA");

Map<String, Long> result =
                source.stream().collect(
                        //Use groupingBy
                        Collectors.groupingBy(
                                Function.identity(), Collectors.counting()
                        )
                );


System.out.println(result);

输出: {USA=4, China=2, Japan=1}

答案 2 :(得分:1)

您可以使用Stream-api执行此操作。

source.stream()
      .collect(Collectors.groupingBy(
                      Function.identity(), 
                      Collectors.counting());

groupingBy - 收集器生成一个映射,其中键由第一个参数给出。可以省略第二个参数以给出具有相同键的每个组的列表。在你的情况下,这将给出这个:

Map("USA" -> List("USA", "USA", "USA", "USA"),
    "Japan" -> List("Japan"),
    "Chine" -> List("China", China"))

通过给收集器作为参数,它将收集每个组(在这种情况下,计算元素的数量)。

答案 3 :(得分:0)

恕我直言你的代码没问题,但可以稍微简化一下:

Map<String, Integer> result = new HashMap<>();
for (String str : source) {
    int i = result.getOrDefault(str, 0);
    result.put(str, i + 1);
}

甚至:

Map<String, Integer> result = new HashMap<>();
for (String str : source) {
    result.put(str, result.getOrDefault(str, 0) + 1);
}