2017-01-04 4 views
1

У меня есть список, который содержит 2 объектов типа Department s и Manager s. Мне нужно отсортировать список по алфавиту по Department s. Класс Department реализует Comparable<Department> и имеет метод compareTo. Но я получаю сообщение об ошибке:Сортировка списка содержит 2 объекта

"Метод сортировки (List, компаратор) в типе Коллекции не применяется для аргументов (List, новый компаратор() {})"

public static List<?> getLst(String fileName)throws FileNotFoundException, IOException,ClassNotFoundException { 
    List<Object> lst = new LinkedList<>(); 
    BufferedInputStream f; 
    try(ObjectInputStream i = new ObjectInputStream(f=new BufferedInputStream(new FileInputStream(fileName)))){ 
     while (f.available()>0) { 
      lst.add(i.readObject()); 
     } 

     Collections.sort(lst, new Comparator<Department>() { 
       @Override 
       public int compare(Department object1,Department object2) { 
        return object1.getDepName().compareTo(object2.getDepName()); 
       } 
      }); 
    } 
    return lst; 
} 
+0

сообщение об ошибке не отображается correctly.It является «Метод сортировки (Список , компаратор ) в коллекциях типа не применяется для аргументов (список , новый Компаратор () {})» –

+0

Ну, вы не можете отсортировать список со компаратором . Вы можете попробовать создать компаратор и посмотреть, есть ли у каждого из объектов тип Department. – mikea

+0

Вы уничтожили защиту типа ... Не создавайте «Список » вместо этого, если вы хотите иметь несколько типов в «Листе», создайте родительский класс и оставите другие классы «продлевайте» его. Затем создайте свой список так: 'List <' name parent class'> '. Это также позволит вам определить сопоставимый метод в родительском классе, который может быть использован всеми дочерними системами. – CraigR8806

ответ

4

Вы не используете дженерики правильно.

Collections.sort() хочет:

  • List<T> и
  • паросочетание Comparator<T>

Вы предоставляете список объектов; а компаратором департаментов. Это просто не может работать.

Таким образом, один из способов разрешения этого - первый изменить свой список, чтобы использовать правильный общий тип:

List<Department> departments = new ArrayList<>(); 

и позже ... добавить (теперь необходимый) бросок так, что входящий «объект» может быть добавлен в этот список отделов - если он имеет правильный тип!

Object fromStream = i.readObject(); 
if (fromStream instanceof Department) { 
    departments.add((Department) fromStream); 
} else { 
    // consider what to do with managers objects ... 

(обратите внимание: lst плохое название, это не говорит ничего, и что один сохранен характер только добавляет путаницы Используйте имена, которые выражают то, что дело за примерно, как departments сделать ясным. : что-то, что содержит, хорошо отделы во множественном числе)

Обновление: дженерики дают нам указание, что у вас есть design проблема здесь. Если вы хотите отсортировать отделы, то ваш список, содержащий отделы, должен не содержать что-нибудь еще.

Другими словами: реальный ответ здесь, чтобы не использование один список, содержащий различные типы объектов, но использовать два списков вместо этого.

+0

Благодарим за помощь. Но список содержит 2 разных объекта. Администратор не может быть отнесен к отделу –

+0

Я вижу ... но на самом деле: это нехороший подход: не имеет смысла размещать отделы и менеджеров в одном списке, когда вы хотите отсортировать «только по отделам»! См. Мой обновленный ответ, хотя! – GhostCat

+0

Еще раз спасибо за вашу помощь. Это просто часть задачи. И я не знаю, как это сделать с 1 списком для 2 объектов. –

0

Дизайн, который ставит менеджеров в одном и том же списке, звучит подозрительно. Вы создаете модель для виджета Tree? Есть более эффективные способы для этого ...

В любом случае, вы можете сделать одну из двух вещей:

  • обеспечивают Comaparator и бросьте внутрь по мере необходимости (плохая идея)
  • или имеют как отдел и Менеджер реализует HasDepartment с методом getDepartment() и создает для этого свой Компаратор.
Смежные вопросы