2014-11-12 2 views
0

У меня есть универсальный класс, пустьКак создать компаратор

public class MyClass<T extends Comparable<T>> { 
    T a; 

    MyClass(T x) { 
     a = x; 
    } 

    public String toString() { 
     return a.toString(); 
    } 
} 

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

Если я пишу это так

public class MyComparator implements Comparator<MyClass> { 
    public int compare(MyClass o1, MyClass o2) { 
     return o1.a.compareTo(o2.a); 
    } 
} 

Я получаю предупреждение Unchecked вызов ...

Будет ли право писать компаратор как

import java.util.Comparator; 

public class MyComparator<T extends Comparable<T>> implements Comparator<MyClass<T>> { 
    public int compare(MyClass<T> o1, MyClass<T> o2) { 
     return o1.a.compareTo(o2.a); 
    } 
} 
+1

кажется мне правильным. Это работает? –

+0

В вашем втором блоке кода вы не помещали 'tools Comparator > {...'. Я полагаю, это была твоя опечатка? – ha9u63ar

+0

да, это работает. Это просто я новичок в дженериках –

ответ

2

Если вы хотите MyClass быть Comparable, так что вы можете сортировать, не переходя в Comparator, что можно было бы сделать примерно с

public class MyClass<T extends Comparable<T>> implements 
     Comparable<MyClass<T>> { 
    T a; 

    MyClass(T x) { 
     a = x; 
    } 

    public String toString() { 
     if (a == null) return "null"; 
     return a.toString(); 
    } 

    @Override 
    public int compareTo(MyClass<T> o) { 
     if (this.a == null) { 
      if (o == null || o.a == null) return 0; 
      return -1; 
     } else if (o == null || o.a == null) return 1; 
     return this.a.compareTo(o.a); 
    } 
} 

Если вы действительно хотите создать MyClassComparator, то он должен выглядеть примерно так,

public class MyClass<T extends Comparable<T>> { 
    T a; 

    MyClass(T x) { 
     a = x; 
    } 

    public String toString() { 
     if (a == null) return "null"; 
     return a.toString(); 
    } 
} 

public class MyClassComparator<T extends Comparable<T>> implements 
     Comparator<MyClass<T>> { 
    @Override 
    public int compare(MyClass<T> left, MyClass<T> right) { 
     if (left == null) { 
      if (right == null) { 
       return 0; 
      } 
      return -1; 
     } else if (right == null) { 
      return 1; 
     } 
     if (left.a == null) { 
      if (right.a == null) { 
       return 0; 
      } 
      return -1; 
     } else if (right.a == null) { 
      return 1; 
     } 
     return left.a.compareTo(right.a); 
    } 
} 
+0

и если 'a' является нулевым? –

+0

@DavidWallace Затем он не работает быстро. –

+0

Хорошо, значит, ваш ответ «да»? –

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