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

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

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

编辑:此代码给我一个错误:

private TreeMap collection = new TreeMap(); 

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

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

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

一点代码:

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

SortedMap ,您可以创建Comparator并将其传递给Collections.sort(List, Comparator)

1。

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

2。

 new TreeMap(new MyComparator()); 

或者不创建MyComparator类:

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

是的。

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

 SortedSet set = new TreeSet(comparator); 

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

我的回答假设您正在使用SortedMapTreeMap实现。

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

2.)示例:

 Comparator cmp = new MyComparator(); Map map = new TreeMap(myComparator); 

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

你制作一个Comparator 。 然后比较器比较您要排序的字段。

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

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

编辑2:如果你只有一堆你投入集合的对象,并且它不是一个Map (即它不是从一组对象到另一个对象的映射),那么你需要一个TreeSet ,而不是TreeMap