Создание общего класса компаратора
Я пытаюсь сделать компаратор, который может взять любой тип элемента для сравнения. Я не уверен, как создать класс. Я просто хочу, чтобы он сравнивал два элемента одного и того же типа (но любой тип, который он дает клиенту, например: Integer, String, Double и т.д.), Чтобы узнать, какой из них больше, чем другой.
public class InsertionComparator implements Comparator<T>
{
/**
* Compares two elements.
*
* @param f1 The first element you want to compare.
* @param f2 The second element you want to compare.
* @return -1,0,1 Whether or not one is greater than, less than,
* or equal to one another.
*/
public int compare(<T> element1,<T> element2)
{
if(element1 < element2)
{
return -1;
}
else
{
if(element1 > element2)
{
return 1;
}
else
{
return 0;
}
}
}
}
Пожалуйста, помогите, спасибо!
Ответы
Ответ 1
Самое близкое, что вы можете сделать, это Comparator
, который может сравнивать любые объекты, реализующие интерфейс Comparable
:
class NaturalComparator<T extends Comparable<T>> implements Comparator<T> {
public int compare(T a, T b) {
return a.compareTo(b);
}
}
Это действительно самое близкое, что вы можете сделать: только объекты Comparable
имеют "естественный порядок", который вы пытаетесь моделировать здесь. Но, как правило, если у вас есть объекты Comparable
, вам необязательно нужен Comparator
: например, Collections.sort
может принимать либо List
с Comparator
, либо List
с Comparable
элементы.
Ответ 2
-
Вы не можете написать один компаратор для всех без каких-либо предположений о том, какими будут типы. Что вы делаете с пользовательскими классами? Как вы можете решить, какой из них больше другого? Для большего количества классов в дикой природе компаратор не имеет смысла.
-
С другой стороны, если вы ограничиваете себя String, Integer, Double, то они сравниваются, и вы можете просто написать компаратор с методом compareTo():
public int compare(T element1,T element2)
{
return element1.compareTo(element2);
}
но тогда вы просто будете использовать естественный порядок элементов, и это победит цель использования компаратора. Обычно в этих случаях вам не нужен.
Ответ 3
Я не знаю, если это обязательно полезно, но невозможно реализовать значимый общий компаратор.
Благодаря интерфейсу отражения вы можете, например, упорядочивать объекты по имени класса. Или, возможно, даже каким-то образом по их иерархии классов. Например, дети после родителей.
Или вы можете отсортировать их в зависимости от того, что их метод toString() производит. Или hashCode(). В конце концов, они есть у каждого объекта.
Что бы вы ни делали, помните, что любой из этих элементов может быть нулевым.
Я думаю, нам нужно знать, для чего вам нужен этот общий компаратор.