Убедитесь, что объекты реализуют Comparable - PullRequest
5 голосов
/ 02 июля 2010

У меня небольшая проблема, и мне было интересно, как ее решить. У меня есть универсальный класс Tuple<A,B>, и теперь я хотел бы отсортировать их кортежи по A и B. Он должен выглядеть следующим образом:

Unsorted:

(1,5)
(2,8)
(6,8)
(1,4)
(2,4)

Сортировка:

(1,4)
(1,5)
(2,4)
(2,8)
(6,8)

По этой причине я подумал о реализации общего метода сравнения (public int compareTo(Tuple<A, B> other)) в классе Tuple. Единственная проблема заключается в том, что все объекты, для которых вы можете параметризовать класс (например, A = Integer, B = String), должны также реализовать метод compareTo, чтобы все это работало.

Есть ли способ гарантировать, что все объекты, которые может хранить кортеж, реализуют интерфейс Comparable?

Или есть еще какие-нибудь предложения по решению этой проблемы?

Спасибо

Ответы [ 3 ]

7 голосов
/ 02 июля 2010

Если вы объявите класс как

public class Tuple<A extends Comparable<? super A>,
                   B extends Comparable<? super B>> { ...

, то это гарантирует, что и A, и B самосопоставимы. Затем вы можете вызвать compareTo() для любого объекта типа A или B, который у вас есть в классе.

5 голосов
/ 02 июля 2010

Вы можете использовать границы рекурсивного типа (см. Также пункт 27 из Effective Java ), чтобы указать, что компоненты кортежа расширяют Comparable, например:

 public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> {
    A valueA;
    B valueB;

    @Override
    public int compareTo(Tuple<A, B> tuple) {
        // Implement comparison logic
        return 0;
    }
}

Это позволяет вам указывать разные типы для компонентов кортежа (Tuple ).

1 голос
/ 02 июля 2010

Это должно сработать.Любой класс, который вы укажете, будет расширяться Comparable.

public class Tuple<? extends Comparable> {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...