Java:SortedMap,TreeMap,Comparable?如何使用?

时间:2009-09-17 16:45:39

标签: java interface comparator treemap sortedmap

我有一个对象列表,我需要根据其中一个字段的属性进行排序。我听说SortedMap和Comparators是最好的方法。

  1. 我是否对我正在排序的类实现Comparable,还是创建一个新类?
  2. 如何实例化SortedMap并传入Comparator?
  3. 排序如何运作?它会在插入新对象时自动对所有内容进行排序吗?
  4. 修改 这段代码给了我一个错误:

    private TreeMap<Ktr> collection = new TreeMap<Ktr>();
    

    (Ktr实施Comparator<Ktr>)。 Eclipse说它期待类似TreeMap<K, V>的东西,所以我提供的参数数量不正确。

5 个答案:

答案 0 :(得分:7)

  1. 更简单的方法是使用现有对象实施Comparable,但您可以创建Comparator并将其传递给SortedMap。 请注意,ComparableComparator是两回事;实现Comparable的类将this与另一个对象进行比较,而实现Comparator的类则比较两个其他对象。
  2. 如果实现Comparable,则不需要将任何特殊内容传递给构造函数。只需致电new TreeMap<MyObject>()即可。 (编辑:除了当然Maps需要两个通用参数,而不是一个。傻我!)
    如果您改为创建另一个实现Comparator的类,则将该类的实例传递给构造函数。
  3. 是的,根据TreeMap Javadocs

  4. 编辑:重新阅读问题时,这一切都没有意义。如果您已有列表,那么明智的做法是实施Comparable,然后在其上调用Collections.sort。不需要地图。

    一点代码:

    public class MyObject implements Comparable<MyObject> {
        // ... your existing code here ...
        @Override
        public int compareTo(MyObject other) {
            // do smart things here
        }
    }
    
    // Elsewhere:
    List<MyObject> list = ...;
    Collections.sort(list);
    

    SortedMap一样,您可以改为创建Comparator<MyObject>并将其传递给Collections.sort(List, Comparator)

答案 1 :(得分:2)

1

这取决于具体情况。假设对象A应该在集合中的对象B之前排序。如果考虑A小于B通常是有意义的,那么实现Comparable是有意义的。如果订单仅在您使用该集合的上下文中有意义,那么您应该创建一个Comparator。

2

new TreeMap(new MyComparator());

或者没有创建MyComparator类:

new TreeMap(new Comparator<MyClass>() {
    int compare(MyClass o1, MyClass o2) { ... }
});

3。是。

答案 2 :(得分:1)

由于你有一个列表并且因为你在地图上有一个参数而得到一个错误,我想你想要一个有序集:

SortedSet<Ktr> set = new TreeSet<Ktr>(comparator);

这将使集合保持排序,即迭代器将按其排序顺序返回元素。您还可以使用特定于SortedSet的方法。如果您还想倒退,可以使用NavigableSet

答案 3 :(得分:0)

我的回答是假设您正在使用TreeMap的{​​{1}}实现。

1。)如果使用SortedMap,您可以选择。您可以直接在您的班级上实施TreeMap,也可以将单独的Comparable传递给构造函数。

2。)示例:

Comparator

3。)是的,这是正确的。内部TreeMap使用红黑树在插入元素时按顺序存储元素;执行插入(或检索)的时间成本是O(log N)。

答案 4 :(得分:0)

你制作了Comparator<ClassYouWantToSort>。然后比较器比较您要排序的字段。

创建TreeMap时,您创建了TreeMap<ClassYouWantToSort>,并将Comparator作为参数传递。然后,当您插入ClassYouWantToSort类型的对象时,TreeMap会使用您的Comparator对其进行正确排序。

编辑:正如亚当斯基所说,你也可以自己ClassYouWantToSort Comparable。优点是您可以处理的类更少,代码更简单,ClassYouWantToSort可以获得方便的默认排序。缺点是ClassYouWantToSort可能没有单一的明显排序,因此无论如何您都必须为其他情况实施Comparables。您也可能无法更改ClassYouWantToSort

EDIT2:如果你只有一堆你投入集合的对象,而且它不是Map(即它不是从一组对象到另一组对象的映射)那么你想要一个{ {1}},而不是TreeSet