2013-06-21 3 views
2

У меня есть список из типа Superclass A, и в этом списке есть несколько объектов из двух подклассов, Subclass B и Subclass C и вы хотите отсортировать их по алфавиту, а затем отфильтровать объекты из подкласса, что-то вроде этого:Сортировка списка суперкласса объектов из двух подклассов

List <A> listA= new ArrayList<A>(); 

Collections.sort(listA); 
    for (A iterator : listA) 
     if (iterator instanceof B) 
      System.out.println(iterator); 

Мой вопрос в том, как я должен структурировать свой код. Должен ли я реализовать Comparable <A> и

public int compareTo(A a) { 
    return name.compareTo(a.getName()); 
} 

в обоих Superclass и Subclass? Если я не буду достаточно ясным, скажите об этом.

EDIT: Я получил ошибку из-за метода, который у меня остался в одном из подклассов, который уже был унаследован от суперкласса, и я думал, что ошибка имеет какое-либо отношение к структуре Comparable<A>, потому что я wasn «Конечно, если это было правильно, но у меня уже был код, как все вы, ребята, сказали мне, но, в любом случае, спасибо.

ответ

3

Если вы можете сравнить экземпляры SuperclassA независимо от того, являются ли они SubclassB или SubclassC, то ваше решение с Comparable<SuperclassA> в суперкласса в одиночку имеет смысл. Если для реализации требуется знание данных, специфичных для подклассов, добавьте абстрактные методы, которые передают эти данные SuperclassA, и назовите их в вашем компараторе.

2

Мой вопрос в том, как я должен структурировать свой код. Должен ли я реализовать Comparable как в суперклассе, так и подклассе?

Нет, этого достаточно, если вы реализуете его в своем суперклассе A. Метод будет наследоваться подклассами.

1

Вам необходимо реализовать Comparable только для суперкласса. После реализации подклассы будут использовать тот же метод в вашем суперклассе для сравнения экземпляров.

Если вы хотите сравнить два подкласса по-разному, вам необходимо переопределить метод compareTo() в ваших подклассах.

Даже в этом случае вам все равно необходимо реализовать Comparable на суперклассе.

1

Вы должны осуществлять Comparable в супер класса А в

Class A implements Comparable<A>{ 
    ..... 
    ..... 

    public int compareTo(Object obj){ 
     if(null != obj && (obj instanceOf A || obj instanceOf B || obj instanceOf C)){ 
     //Compare your properties here and return -1, 0 or 1 depending on the result of comparision. 
     }else{ 
      throw new IlligalArgumentException(); 
     } 
} 
1

я предлагаю вам реализовать Comparator

public NameAndClassComparator implements Comparator<A> { 
    public int compare(A left, a right) { 
     if(left == null && right == null) { 
      return 0; 
     } 
     if(left == null) { 
      return -1; 
     } 
     if(right == null) { 
      return 1; 
     } 

     int retVal = left.getname().compareTo(right.getName()); 

     if(retVal == 0) { 
      retVal = left.getClass().getName().compareTo(right.getClass().getName()); 
     } 

     return retVal; 
    } 
} 

И затем использовать этот компаратор, чтобы сравнить свои объекты:

Collections.sort(listA, new NameAndClassComparator()); 
0

Вам необходимо реализовать Comparable только для суперкласса. Поскольку после реализации подкласса вы также можете сравнить экземпляры с использованием этого метода в суперклассе. Так что мой совет - реализовать сопоставимые по суперклассу.