首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何计算元素在列表中出现的次数

如何计算元素在列表中出现的次数
EN

Stack Overflow用户
提问于 2009-02-03 03:29:14
回答 23查看 417.2K关注 0票数 216

我有一个

,Java的一个集合类,如下所示:

ArrayList animals = new ArrayList();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");

如您所见,

包含3个

元素和一个

元素。我想知道Collection框架中是否有任何API可以返回

或者是否有其他方法来确定出现的次数。

我发现谷歌的收藏

具有返回元素出现的总次数的API。但这只与JDK 1.5兼容。我们的产品目前是JDK 1.6,所以我不能使用它。

EN

回答 23

Stack Overflow用户

发布于 2010-03-17 11:35:25

我非常确定Collections中的静态频率方法在这里会派上用场:

int occurrences = Collections.frequency(animals, "bat");

不管怎么说,我就是这么做的。我非常确定这是jdk 1.6。

票数 392
EN

Stack Overflow用户

发布于 2014-11-30 03:18:40

在Java 8中:

Map counts =
    list.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));
票数 138
EN

Stack Overflow用户

发布于 2009-02-03 22:50:28

这说明了为什么“

通过接口引用对象

“如中所述

有效的Java

书。

如果你对实现进行编码,并在代码中使用ArrayList,比如说,在你的代码中有50个位置,当你找到一个很好的“列表”实现来计算这些条目时,你将不得不更改所有这50个位置,并且很可能你将不得不破坏你的代码(如果它只被你使用,这没什么大不了的,但如果它被其他人使用,你也会破坏他们的代码)(如果它只被你使用,没有什么大不了的,但如果它被其他人使用,你也会破坏他们的代码)

通过对接口进行编程,您可以让这50位保持不变,并将实现从ArrayList替换为"CountItemsList“(例如)或其他一些类。

下面是一个关于如何编写的非常基本的示例。这只是一个示例,生产就绪列表将是

更复杂。

import java.util.*;

public class CountItemsList extends ArrayList { 

    // This is private. It is not visible from outside.
    private Map count = new HashMap();

    // There are several entry points to this class
    // this is just to show one of them.
    public boolean add( E element  ) { 
        if( !count.containsKey( element ) ){
            count.put( element, 1 );
        } else { 
            count.put( element, count.get( element ) + 1 );
        }
        return super.add( element );
    }

    // This method belongs to CountItemList interface ( or class ) 
    // to used you have to cast.
    public int getCount( E element ) { 
        if( ! count.containsKey( element ) ) {
            return 0;
        }
        return count.get( element );
    }

    public static void main( String [] args ) { 
        List animals = new CountItemsList();
        animals.add("bat");
        animals.add("owl");
        animals.add("bat");
        animals.add("bat");

        System.out.println( (( CountItemsList )animals).getCount( "bat" ));
    }
}

这里应用的OO原则:继承、多态性、抽象、封装。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/505928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档