Java: сравниваемый <List <T extends Compareable <T>>> - PullRequest
2 голосов
/ 19 октября 2010

Существует ли какая-либо реализация Compareable<Collection<T extends Compareable<T>>> в Java (которая ведет себя как std::list<T>::operator<() или std::set<T>::operator<()) в C ++?


Правка: Comparator будет иметь больше смысла ...

Ответы [ 2 ]

5 голосов
/ 19 октября 2010

Не то, чтобы я знал, но это не должно быть слишком сложно писать.

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;
    }
}
0 голосов
/ 21 октября 2010

Я не знаю о тех операторах C ++, о которых вы упомянули, но я предполагаю, что означает, что вам нужен компаратор, который сравнивает коллекции лексикографически.

Гуава имеет это благодаря своему превосходному классу Ordering: Ordering.lexicographic ()

Возвращает новый порядок, который сортирует итерации, сравнивая соответствующие элементы попарно, пока не будет найден ненулевой результат;навязывает «словарный порядок».Если достигнут конец одной итерации, но не другой, более короткая итерация считается меньшей, чем более длинная.Например, лексикографическое естественное упорядочивание целых чисел учитывает [] < [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();
...