集合排序列表包含2个对象

时间:2017-01-04 13:58:11

标签: java sorting collections

我有一个列表,其中包含2个类型为DepartmentManager s的对象。

我需要按Department的字母顺序对列表进行排序。 Department类实现Comparable<Department>并使用方法compareTo。但是我收到一条错误消息:

  

&#34;类型中的方法sort(List,Comparator)   集合不适用于参数(List,new   比较器(){})&#34;

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;
} 

2 个答案:

答案 0 :(得分:4)

您没有正确使用泛型。

Collections.sort()想要:

  • a 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要明确:包含的内容,以及复数的部门)

更新:泛型提示您在此处遇到设计问题。如果您要对部门进行排序,那么包含部门的列表应包含其他任何内容。

换句话说:这里真正的答案是使用包含不同类型对象的一个列表,但要使用两个列表代替。

答案 1 :(得分:0)

将管理人员列入同一名单的设计听起来令人怀疑。你在为树小部件制作模型吗?有更好的方法...

无论如何,你可以做以下两件事之一:

  • 根据需要提供Comaparator并投射内部(不好主意)
  • 或让Department和Manager使用getDepartment()方法实现HasDepartment,并为此构建Comparator。