7

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

  1. 我是实现 Comparable 与我正在排序的类,还是创建一个新类?
  2. 如何实例化 SortedMap 并传入 Comparator?
  3. 排序是如何工作的?它会在插入新对象时自动对所有内容进行排序吗?

编辑: 这段代码给了我一个错误:

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

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

4

5 回答 5

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

编辑:在重新阅读问题时,这些都没有意义。如果您已经有一个列表,那么明智的做法是实施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,您可以改为创建 aComparator<MyObject>并将其传递给Collections.sort(List, Comparator).

于 2009-09-17T16:50:16.070 回答
3

1.

这取决于情况。假设对象 A 应该在您的集合中的对象 B 之前排序。如果认为 A 小于 B 通常是有意义的,那么实现 Comparable 将是有意义的。如果顺序仅在您使用集合的上下文中有意义,那么您可能应该创建一个比较器。

2.

new TreeMap(new MyComparator());

或者不创建 MyComparator 类:

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

3. 是的。

于 2009-09-17T16:53:32.677 回答
2

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

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

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

于 2009-09-17T17:58:39.590 回答
1

我的回答假设您正在使用TreeMap.SortedMap

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

2.) 示例:

Comparator<A> cmp = new MyComparator();
Map<A,B> map = new TreeMap<A,B>(myComparator);

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

于 2009-09-17T16:50:35.133 回答
0

你做一个Comparator<ClassYouWantToSort>. 然后比较器比较您要排序的字段。

当您创建 时TreeMap,您会创建一个TreeMap<ClassYouWantToSort>,并Comparator作为参数传入 。然后,当您插入 typeClassYouWantToSort的对象时,TreeMap使用 yourComparator对它们进行正确排序。

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

EDIT2:如果您只有一堆要放入集合中的对象,并且它不是 a Map(即它不是从一组对象到另一组对象的映射),那么您想要 a TreeSet,而不是 a TreeMap

于 2009-09-17T16:50:44.063 回答