У меня есть litte проблема, и задавался вопросом, как решить ее. У меня есть универсальный класс Tuple<A,B>
и теперь я хотел бы отсортировать их кортежи согласно A и B. Это должно быть похожим на это:
Неотсортированный:
(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)
) в классе Кортежа. Единственная проблема состоит в том, что все объекты, для которых Вы могли параметризовать класс (например, A=Integer, B=String) должны реализовать compareTo метод также для этой целой вещи работать.
Существует ли способ гарантировать, чтобы все объекты, которые может содержать Кортеж, реализовали интерфейс Comparable?
Или есть ли какие-либо другие предложения о том, как решить эту проблему?
Спасибо
Вы можете использовать границы рекурсивного типа (см. Также Правило 27 из Эффективная 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
Это должно помочь. Любой указанный вами класс должен будет расширить Comparable.
public class Tuple<? extends Comparable> {
}
Если вы объявляете класс как
public class Tuple<A extends Comparable<? super A>,
B extends Comparable<? super B>> { ...
, это гарантирует, что и A, и B будут самосопоставимыми. Затем вы можете вызвать compareTo ()
для любого объекта типа A или B, который есть в вашем классе.