Java TreeMultiset是否只保存每个键的重复次数?

Java TreeMultiset是否只保存每个键的重复次数?,java,guava,Java,Guava,我用TreeMultiset尝试了以下代码。似乎“*Twin”条目被丢弃,重复次数存储在TreeMultiset中。我想这是一个特性,而不是一个bug。是否有一个对象存储每个对象,而不是一个键和重复次数 public class Guava { public static class Obj implements Comparable<Obj> { String name; int age; public Obj(Stri

我用TreeMultiset尝试了以下代码。似乎“*Twin”条目被丢弃,重复次数存储在TreeMultiset中。我想这是一个特性,而不是一个bug。是否有一个对象存储每个对象,而不是一个键和重复次数

public class Guava {

    public static class Obj implements Comparable<Obj> {

        String name;
        int age;

        public Obj(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return String.format("%s@%d", name, age);
        }

        @Override
        public int compareTo(Obj o) {
            return Integer.compare(age, o.age);
        }
    }

    public static void main(String[] args) {
        TreeMultiset<Obj> tree = TreeMultiset.create();
        tree.add(new Obj("Ajo", 37));
        tree.add(new Obj("AjoTwin", 37));
        tree.add(new Obj("Ari", 31));
        tree.add(new Obj("AriTwin", 31));
        tree.add(new Obj("Fly", 1));
        System.out.println(tree.size());
        for (Obj obj : tree) {
            System.out.println(obj);
        }
    }
}
公共级番石榴{
公共静态类Obj实现了可比较的{
字符串名;
智力年龄;
公共对象(字符串名称,整数){
this.name=名称;
这个。年龄=年龄;
}
@凌驾
公共字符串toString(){
返回字符串。格式(“%s@%d”,名称,年龄);
}
@凌驾
公共国际比较(Obj o){
返回整数。比较(年龄,o.age);
}
}
公共静态void main(字符串[]args){
TreeMultiset tree=TreeMultiset.create();
添加(新的Obj(“Ajo”,37));
添加(新的Obj(“AjoTwin”,37));
添加(新Obj(“Ari”,31));
添加(新的Obj(“AriTwin”,31));
添加(新的Obj(“Fly”,1));
System.out.println(tree.size());
for(对象对象:树){
系统输出打印项次(obj);
}
}
}

如果你说两个对象相等,但实际上并不相等,这肯定会导致混淆。在本例中,我将使用Obj列表


对于您的示例,如果您更改了比较,您可以使用树集,但我认为您希望能够按整数查找。在这种情况下,您可以使用树形图。

如果您说两个对象相等,但实际上并不相等,这必然会导致混淆。在本例中,我将使用Obj列表


对于您的示例,如果您更改了比较,您可以使用树集,但我认为您希望能够按整数查找。在这种情况下,您可以使用树形图。

我们可以肯定的是:

:请注意,
Multiset
不是
Map
,尽管这可能是
Multiset
实现的一部分
Multiset
是一种真正的
集合
类型,满足所有相关的合同义务

这意味着
MultiSet
或多或少是一个同样重要的
Set
(它没有实现
Set
)。而且
集合
不包含重复元素

真正的
集合
也只保留插入的第一个元素,并丢弃任何其他相等的元素

:如果此集合已包含元素,则调用将保持集合不变并返回false

由于
TreeMultiSet
使用
compareTo
而不是
equals
,因此您必须得到您得到的结果

注意:您应该实现
.equals
模拟到
.compareTo

:比较必须与可比等级规范中解释的相等值一致。否则,生成的multiset将违反集合约定,该约定是根据Object.equals(java.lang.Object)指定的



如果您想要可以存储多个元素的东西,请尝试使用
(列表)MultiMap
。这基本上是一个
映射
,如果元素具有相同的键,它会自动将元素添加到列表中。

我们可以肯定的是:

:请注意,
Multiset
不是
Map
,尽管这可能是
Multiset
实现的一部分
Multiset
是一种真正的
集合
类型,满足所有相关的合同义务

这意味着
MultiSet
或多或少是一个同样重要的
Set
(它没有实现
Set
)。而且
集合
不包含重复元素

真正的
集合
也只保留插入的第一个元素,并丢弃任何其他相等的元素

:如果此集合已包含元素,则调用将保持集合不变并返回false

由于
TreeMultiSet
使用
compareTo
而不是
equals
,因此您必须得到您得到的结果

注意:您应该实现
.equals
模拟到
.compareTo

:比较必须与可比等级规范中解释的相等值一致。否则,生成的multiset将违反集合约定,该约定是根据Object.equals(java.lang.Object)指定的



如果您想要可以存储多个元素的东西,请尝试使用
(列表)MultiMap
。这基本上是一个
映射
,如果元素具有相同的键,它会自动将元素添加到列表中。

如果您想要一个集合来维护多个
相等的元素
,您不应该使用
集合
。您可能需要考虑使用
equals
的正常实现,并对相同年龄的行为使用
equality
。如果您想要一个集合来维护多个
相等的元素,则不应该使用
集合。您可能需要考虑使用
equals
的正常实现,并对相同年龄的行为使用
equality