我有一个对象列表,我需要根据其中一个字段的属性进行排序。我听说SortedMap和Comparators是最好的方法。
修改 这段代码给了我一个错误:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(Ktr实施Comparator<Ktr>
)。 Eclipse说它期待类似TreeMap<K, V>
的东西,所以我提供的参数数量不正确。
答案 0 :(得分:7)
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 :(得分:2)
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。是。
答案 2 :(得分:1)
由于你有一个列表并且因为你在地图上有一个参数而得到一个错误,我想你想要一个有序集:
SortedSet<Ktr> set = new TreeSet<Ktr>(comparator);
这将使集合保持排序,即迭代器将按其排序顺序返回元素。您还可以使用特定于SortedSet的方法。如果您还想倒退,可以使用NavigableSet。
答案 3 :(得分:0)
我的回答是假设您正在使用TreeMap
的{{1}}实现。
1。)如果使用SortedMap
,您可以选择。您可以直接在您的班级上实施TreeMap
,也可以将单独的Comparable
传递给构造函数。
2。)示例:
Comparator
3。)是的,这是正确的。内部TreeMap使用红黑树在插入元素时按顺序存储元素;执行插入(或检索)的时间成本是O(log N)。
答案 4 :(得分:0)
你制作了Comparator<ClassYouWantToSort>
。然后比较器比较您要排序的字段。
创建TreeMap
时,您创建了TreeMap<ClassYouWantToSort>
,并将Comparator
作为参数传递。然后,当您插入ClassYouWantToSort
类型的对象时,TreeMap
会使用您的Comparator
对其进行正确排序。
编辑:正如亚当斯基所说,你也可以自己ClassYouWantToSort
Comparable
。优点是您可以处理的类更少,代码更简单,ClassYouWantToSort
可以获得方便的默认排序。缺点是ClassYouWantToSort
可能没有单一的明显排序,因此无论如何您都必须为其他情况实施Comparables
。您也可能无法更改ClassYouWantToSort
。
EDIT2:如果你只有一堆你投入集合的对象,而且它不是Map
(即它不是从一组对象到另一组对象的映射)那么你想要一个{ {1}},而不是TreeSet
。