Java:SortedMap,TreeMap,Comparable?如何使用?
-
10-07-2019 - |
题
我有一个对象列表,我需要根据其中一个字段的属性进行排序。我听说SortedMap和Comparators是最好的方法。
- 我是否对我正在排序的类实现Comparable,还是创建一个新类?
- 如何实例化SortedMap并传入Comparator?
- 排序如何运作?它会在插入新对象时自动对所有内容进行排序吗? 醇>
修改强> 这段代码给了我一个错误:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(Ktr实施Comparator<Ktr>
)。 Eclipse说它期待类似TreeMap<K, V>
的东西,所以我提供的参数数量不正确。
解决方案
- 更简单的方法是使用现有对象实现
Comparable
,但您可以创建Comparator
并将其传递给SortedMap
。
请注意this
和new TreeMap<MyObject>()
是两回事;实现Maps
将TreeMap
与另一个对象进行比较的类,而实现Collections.sort
的类则比较两个其他对象。 - 如果实现
Comparator<MyObject>
,则无需将任何特殊内容传递给构造函数。只需致电Collections.sort(List, Comparator)
。 (编辑:除了当然<=>需要两个通用参数,而不是一个。傻我!)
如果您改为创建另一个实现<=>的类,请将该类的实例传递给构造函数。 - 是的,根据 <=> Javadocs 醇>
编辑:重新阅读问题时,这一切都没有意义。如果您已有列表,那么明智的做法是实现<=>然后调用 <=> 就可以了。不需要地图。
一点代码:
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:如果你只有一堆你扔进集合的对象,并且它不是<=>(即它不是从一组对象到另一组对象的映射)那么你想要一个<=> ,而不是<=>。