Java 用于计算相等项目频率的数据结构

Java 用于计算相等项目频率的数据结构,java,algorithm,data-structures,hashmap,set,Java,Algorithm,Data Structures,Hashmap,Set,我需要像HashSet这样的数据结构 它不应将同一项添加到集合中 但与其添加同一项,不如计算添加该项的次数 据我所知,HashSet首先计算hashCode,如果hashCode相同,它会检查equals方法,如果为true,则不会添加项,否则具有相同hashCode但另一个equals的项将添加到bucket链表中 我需要做的是只保留唯一的对象,如Set所做的,但只使用equals方法,并且如果对象等于与每个对象关联的递增计数器 是否已经实现了这样的数据结构,或者我应该创建自己的数据结构 看来

我需要像HashSet这样的数据结构

  • 它不应将同一项添加到集合中
  • 但与其添加同一项,不如计算添加该项的次数
  • 据我所知,
    HashSet
    首先计算
    hashCode
    ,如果
    hashCode
    相同,它会检查
    equals
    方法,如果为true,则不会添加项,否则具有相同
    hashCode
    但另一个
    equals
    的项将添加到bucket链表中

    我需要做的是只保留唯一的对象,如
    Set
    所做的,但只使用
    equals
    方法,并且如果对象等于与每个对象关联的递增计数器


    是否已经实现了这样的数据结构,或者我应该创建自己的数据结构

    看来你真正需要的是一张地图。对于每个项目,您可以拥有项目数

    public class ItemCounter<T>{
    
        private Map<T, Integer> counts = new HashMap<T, Integer>();
    
        public void addItem(T item){
            Integer numberOfOcurrences = counts.get( item );            
            numberOfOcurrences = numberOfOcurrences == null ? 0 : numberOfOcurrences+1;
            counts.put( item,  numberOfOcurrences);            
        }
    
        public Integer getCount( T item ){
            Integer numberOfOcurrences = counts.get( item );    
            return numberOfOcurrences == null ? 0 : numberOfOcurrences;
        }
    }
    
    公共类ItemCounter{
    私有映射计数=新HashMap();
    公共无效附加项(T项){
    整数numberOfOcurrences=counts.get(项);
    numberOfOcurrences=numberOfOcurrences==null?0:numberOfOcurrences+1;
    计数。放置(项目、事件数);
    }
    公共整数getCount(T项){
    整数numberOfOcurrences=counts.get(项);
    返回numberOfOcurrences==null?0:numberOfOcurrences;
    }
    }
    
    看来你真正需要的是一张地图。对于每个项目,您可以拥有项目数

    public class ItemCounter<T>{
    
        private Map<T, Integer> counts = new HashMap<T, Integer>();
    
        public void addItem(T item){
            Integer numberOfOcurrences = counts.get( item );            
            numberOfOcurrences = numberOfOcurrences == null ? 0 : numberOfOcurrences+1;
            counts.put( item,  numberOfOcurrences);            
        }
    
        public Integer getCount( T item ){
            Integer numberOfOcurrences = counts.get( item );    
            return numberOfOcurrences == null ? 0 : numberOfOcurrences;
        }
    }
    
    公共类ItemCounter{
    私有映射计数=新HashMap();
    公共无效附加项(T项){
    整数numberOfOcurrences=counts.get(项);
    numberOfOcurrences=numberOfOcurrences==null?0:numberOfOcurrences+1;
    计数。放置(项目、事件数);
    }
    公共整数getCount(T项){
    整数numberOfOcurrences=counts.get(项);
    返回numberOfOcurrences==null?0:numberOfOcurrences;
    }
    }
    
    最简单的方法(没有依赖项)是使用
    哈希映射。或者您可以使用Guava's,它有一个
    count(Object)
    方法来获取集合中某个对象的出现次数。

    最简单的方法(没有依赖项)是使用
    HashMap
    。或者你可以使用Guava's,它有一个
    count(Object)
    方法来获取集合中某个对象的出现次数。

    你真的不想只使用equals,除非你真的想检查你在每次迭代中已经看到的一切。听起来你只是想给我一个
    HashMap
    。或者,如果你能用番石榴,一个。“我不在乎hashCode,我只在乎equal方法”。再加上安迪的评论——如果你不以与
    equals
    一致的方式覆盖
    hashCode
    ,那么坏事情可能会发生在意想不到的地方。始终值得确保一致地覆盖它们(或者根本不覆盖它们)。@bkdaaqra您可能误解了哈希代码的用途:它用于表示两个对象是否绝对不相等,这表明它们的哈希代码不同。如果hashcodes不同,则不会使用
    equals
    对对象进行比较。您确实不希望只使用equals,除非您确实需要检查在每次迭代中已经看到的所有内容。听起来你只是想给我一个
    HashMap
    。或者,如果你能用番石榴,一个。“我不在乎hashCode,我只在乎equal方法”。再加上安迪的评论——如果你不以与
    equals
    一致的方式覆盖
    hashCode
    ,那么坏事情可能会发生在意想不到的地方。始终值得确保一致地覆盖它们(或者根本不覆盖它们)。@bkdaaqra您可能误解了哈希代码的用途:它用于表示两个对象是否绝对不相等,这表明它们的哈希代码不同。如果哈希代码不同,则不会使用
    equals
    “因此它总是使用equals进行检查”——仅当找到哈希代码匹配的候选对象时。如果您有一个已经有10个项目(哈希代码1…10)的集合,并且您尝试添加一个哈希代码为100的新项目,那么它根本不会调用
    equals
    。“因此它总是使用equals进行检查”-仅当找到哈希代码匹配的候选项时。如果您有一个已经有10个项目(哈希代码1…10)的集合,并且您尝试添加一个哈希代码为100的新项目,那么它根本不会调用
    equals