我有我需要根据自己的领域之一的属性来排序对象的列表。 我听说SortedMap的和比较是做到这一点的最好办法。
- 难道我实现比得上我整理类,还是我创建一个新类?
- 如何实例化的SortedMap,并通过在比较?
- 如何排序的工作? 作为新对象插入它会自动排序的一切吗?
编辑:此代码是给我的错误:
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
的Javadoc 。
编辑:在重新阅读的问题,这一切都不是有道理的。 如果你已经有一个列表中,明智的做法是实现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之前进行排序。 如果是一般有意义的考虑比B少,则实现可比才有意义。 如果订单不仅使在您使用的设置上下文意识,那么你或许应该建立一个比较。
2。
new TreeMap(new MyComparator());
或者没有创建MyComparator类:
new TreeMap(new Comparator<MyClass>() {
int compare(MyClass o1, MyClass o2) { ... }
});
是的。
既然你有一个清单,因为你有地图,你想要一个有序集合,我想对一个参数得到一个错误:
SortedSet<Ktr> set = new TreeSet<Ktr>(comparator);
这将保持排序的集合,即一个迭代器将返回它们的排序顺序的元素。 也有具体的方法SortedSet的 ,你可能需要使用。 如果你也想往回走,你可以使用NavigableSet 。
我的回答假设你正在使用的TreeMap
实施SortedMap
。
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
给他们正确排序。
编辑:由于亚当斯基所指出的,你也可以让ClassYouWantToSort
本身Comparable
。 其优点是,你有更少的类来处理,代码简单, ClassYouWantToSort
得到一个方便的默认排序。 它的缺点是ClassYouWantToSort
可能没有一个明显的排序,所以你必须实现Comparables
的其他情形反正。 你也可能无法改变ClassYouWantToSort
。
EDIT2:如果你只是有一堆,你扔进收集的对象,这是不是一个Map
(即它不是从一组对象映射到另一个),那么你想有一个TreeSet
,而不是一个TreeMap
。