TreeMultiset只保存每个键的重复次数吗?

时间:2013-08-06 18:42:04

标签: java guava

我使用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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

如果你说两个对象是平等的,但不是真的相等,这必将导致混乱。在这种情况下,我会使用一个Obj列表列表。

对于您的示例,如果您更改了比较,则可以使用TreeSet,但我想您希望能够通过整数查找。在这种情况下,您可以使用TreeMultimap。

答案 1 :(得分:1)

我们确切知道的是:

  

MultiSet-Docu:请注意Multiset<E>不是Map<E, Integer>,但这可能是Multiset实施的一部分。 Multiset是真正的Collection类型,并且满足所有相关的合同义务。

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

Set也只保留您插入的第一个元素,并丢弃任何更多相等的元素。

  

Set#add(E):如果此集已包含该元素,则调用将保持集不变并返回false。

由于TreeMultiSet使用compareTo代替equals,您必须以最终结果获得结果。

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

  

TreeMultiSet-Docu:比较必须与Equal一致,如Comparable类规范所述。否则,生成的multiset将违反Collection合同,该合同是根据Object.equals(java.lang.Object)指定的。


如果您想要能存储多个元素的内容,请尝试(List)MultiMap。这基本上是一个Map<Key, List<Value>>,如果它们具有相同的密钥,它会自动将元素添加到列表中。