Создание общего класса компаратора

Я пытаюсь сделать компаратор, который может взять любой тип элемента для сравнения. Я не уверен, как создать класс. Я просто хочу, чтобы он сравнивал два элемента одного и того же типа (но любой тип, который он дает клиенту, например: 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(). В конце концов, они есть у каждого объекта.

Что бы вы ни делали, помните, что любой из этих элементов может быть нулевым.

Я думаю, нам нужно знать, для чего вам нужен этот общий компаратор.