2

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

2 回答 2

3

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

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

于 2013-08-06T18:52:50.407 回答
1

我们可以肯定的是:

MultiSet-Docu:请注意,Multiset<E>它不是 a Map<E, Integer>,尽管它可能是Multiset实现的一部分。Multiset是一个真实的Collection类型,并满足所有相关的合同义务。

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

trueSet也只保留您插入的第一个元素并丢弃任何其他相等的元素。

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

因为TreeMultiSet使用compareTo而不是equals你必须得到你得到的结果。

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

TreeMultiSet-Docu:比较必须与 Comparable 类规范所解释的 equals 一致。否则,生成的多重集将违反 Collection 契约,该契约是根据 Object.equals(java.lang.Object) 指定的。


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

于 2013-08-06T20:13:42.140 回答