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

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

最佳答案

我们唯一可以确定的是:


  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:比较必须与Comparable类规范中说明的equals保持一致。否则,生成的多集将违反按Object.equals(java.lang.Object)指定的Collection合同。




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

10-07 18:48