Java 中是否有任何Compareable<Collection<T extends Compareable<T>>>
实现(其行为类似于 C++std::list<T>::operator<()
或std::set<T>::operator<()
)?
编辑:Comparator
会更有意义......
Java 中是否有任何Compareable<Collection<T extends Compareable<T>>>
实现(其行为类似于 C++std::list<T>::operator<()
或std::set<T>::operator<()
)?
编辑:Comparator
会更有意义......
不是我知道的,但写起来应该不会太难。
compareTo(Collection<T> other) {
Iterator<T> i1 = this.iterator();
Iterator<T> i2 = other.iterator();
while(i1.hasNext() && i2.hasNext()) {
int c = i1.next().compareTo(i2.next());
if(c != 0) {
return c;
}
}
if(i1.hasNext()){
return 1;
} else if(i2.hasNext()) {
return -1;
} else {
return 0;
}
}
我不知道您提到的那些 C++ 运算符,但我假设您想要的是一个按字典顺序比较集合的比较器。
番石榴通过其优秀的Ordering
课程来实现这一点:Ordering.lexicographical()
返回一个新的排序,它通过成对比较对应的元素来对迭代进行排序,直到找到非零结果;强加“字典顺序”。如果到达了一个可迭代对象的末尾,但没有到达另一个,则认为较短的可迭代对象小于较长的可迭代对象。例如,整数上的字典自然排序考虑
[] < [1] < [1, 1] < [1, 2] < [2]
.
假设您想订购 aList<List<String>>
基于String
的自然顺序:
List<List<String>> lists = ...;
Ordering<Iterable<String>> comparator = Ordering.natural().lexicographical();
Collections.sort(lists, comparator);
鉴于这是Ordering
该类的一部分,您也可以获得它的全部功能,包括将它与任何任意比较器一起使用的能力:
/*
* This comparator will use a case insensitive comparison of individual
* strings in determining the ordering.
*/
Ordering<Iterable<String>> comparator =
Ordering.from(String.CASE_INSENSITIVE_ORDER).lexicographical();
/*
* This comparator uses a Function<Foo, Long> (Foo.GET_ID) to compare the IDs
* of Foo instances.
*/
Ordering<Iterable<Foo>> comparator =
Ordering.natural().onResultOf(Foo.GET_ID).lexicographical();