繁体   English   中英

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

[英]Java: SortedMap, TreeMap, Comparable? How to use?

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

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

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

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

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

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

编辑:在重新阅读问题时,这一切都没有意义。 如果你已经有了一个列表,那么明智的做法就是实现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。

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

2。

new TreeMap(new MyComparator());

或者不创建MyComparator类:

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

是的。

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

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

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

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

1.)如果使用TreeMap ,您可以选择。 您可以直接在类上实现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类型的对象时, TreeMap使用您的Comparator对它们进行正确排序。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM