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

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

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

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

有帮助吗?

解决方案

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

  4. 编辑:重新阅读问题时,这一切都没有意义。如果您已有列表,那么明智的做法是实现<=>然后调用 <=> 就可以了。不需要地图。

    一点代码:

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

    与<=>一样,您可以改为创建<=>并将其传递给 <=>

其他提示

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。是。

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

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

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

我的回答是假设您正在使用TreeMap SortedMap的实现。

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

2。)示例:

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

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

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

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

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

EDIT2:如果你只有一堆你扔进集合的对象,并且它不是<=>(即它不是从一组对象到另一组对象的映射)那么你想要一个<=> ,而不是<=>。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top