Java:可比较<list <t extends =“”可比较<t =“”>&gt;&gt; </list <t>

时间:2010-10-18 22:47:54

标签: java comparable

Java中是否有Compareable<Collection<T extends Compareable<T>>>实现(表现为C ++的std::list<T>::operator<()std::set<T>::operator<())?


编辑:Comparator会更有意义......

2 个答案:

答案 0 :(得分:5)

不是我所知道的,但写起来应该不会太难。

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;
    }
}

答案 1 :(得分:0)

我不知道你提到的那些C ++运算符,但我假设你想要的是一个按字典顺序比较集合的比较器。

Guava通过其出色的Ordering课程Ordering.lexicographical()

来实现这一目标
  

返回一个新的排序,它通过成对地比较相应的元素来排序迭代,直到找到非零结果;强加“字典顺序”。如果到达一个iterable的末尾而不是另一个,则认为较短的iterable小于较长的iterable。例如,整数的词典自然排序考虑[] < [1] < [1, 1] < [1, 2] < [2]

假设您想根据List<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();