[英]Java: SortedMap, TreeMap, Comparable? How to use?
我有一个对象列表,我需要根据其中一个字段的属性进行排序。 我听说SortedMap和Comparators是最好的方法。
编辑:这段代码给我一个错误:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(Ktr实现Comparator<Ktr>
)。 Eclipse说它期待类似TreeMap<K, V>
,所以我提供的参数数量不正确。
Comparable
,尽管您可以创建Comparator
并将其传递给SortedMap
。 Comparable
和Comparator
是两回事; 实现一类Comparable
比较this
另一目的,而实施的一类Comparator
进行比较的其他两个对象。 Comparable
,则不需要将任何特殊内容传递给构造函数。 只需调用new TreeMap<MyObject>()
。 ( 编辑:除了当然Maps
需要两个通用参数,而不是一个。傻我!) Comparator
的类,则将该类的实例传递给构造函数。 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 。
我的回答假设您正在使用SortedMap
的TreeMap
实现。
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.