2013-03-03 6 views
12

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

Помогите, спасибо!

+0

Во-первых, у вас есть несколько синтаксических ошибок. Попробуйте прочитать статью [Generics in Java] (http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf). Это позволит вам решить эту проблему и любые другие проблемы самостоятельно, поскольку она объясняет, какие дженерики и как их использовать довольно хорошо. –

+0

Для чего вам это нужно? Я чувствую, что это не твоя настоящая проблема. –

+0

Это для введенных пользователем данных, как в только числах, датах и ​​буквах? Компаратор может использоваться для любого класса Java, например, для сравнения одного окна с другим, поэтому ваш вопрос кажется немного шире, как сейчас, пожалуйста, укажите. – Geronimo

ответ

21

Ближайшей вещь, которую вы можете сделать, чтобы это 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 элементами.

+0

Удобный, если коварный способ получить сравнительный код натурального порядка: 'Collections.reverseOrder (Collections.reverseOrder());' – VGR

+4

для получения наилучших результатов, используйте 'T extends Comparable ' – newacct

5
  1. Вы не можете написать ни одного компаратора для всех без каких-либо предположений о том, какими будут типы. Что вы делаете с пользовательскими классами? Как вы можете решить, какой из них больше другого? Для большего количества классов в дикой природе компаратор не имеет смысла.

  2. С другой стороны, если вы ограничите себя String, Integer, Double, то они сопоставимы, и вы можете просто написать компаратор с CompareTo() метод:

    public int compare(T element1,T element2) 
    { 
        return element1.compareTo(element2); 
    } 
    

но то вы просто будете использовать естественный порядок элементов, и это победит цель использования компаратора. Обычно в этих случаях вам не нужен.

0

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

Благодаря интерфейсу отражения вы можете, например, упорядочить объекты по их имени класса. Или, может быть, даже в какой-то мере их иерархией классов. Например, дети после родителей.

Или вы можете отсортировать их по их методу toString(). Или hashCode(). В конце концов, каждый объект имеет их.

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

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

Смежные вопросы