2017-01-04 6 views
1

私はリストがあります。リストにはタイプDepartmentManagerの2つのオブジェクトが含まれています。 アルファベット順にリストをソートする必要があります。Department s。 DepartmentクラスはComparable<Department>を実装し、方法はcompareToです。リストのコレクションの種類には2つのオブジェクトが含まれています

「 コレクションは、引数には適用されませんタイプのメソッドソート(リスト、コンパレータ)(一覧、新しい コンパレータ(){})」

:しかし、私はエラーメッセージが表示されます。
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'内に複数の型を持たなければならない場合は' List 'を作成せず、親クラスを作成し、他のクラスを' extend'してください。次に 'List <' name of 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が悪いの名前であり、それは 何も、および のみは混乱を追加し、1つの保存された文字を言わない事が背後に約あるか表現の名前を使用します。 departmentsのように明確にします。 :複数で、うまく部門が含まれている何か)

更新:ジェネリック医薬品は、あなたがここにデザイン問題を抱えているヒントを与えます。 部門をにソートする場合は、部門を含むリストにはでなく、には他のものが含まれている必要があります。言い換えれば

は:ここでの本当の答えは、さまざまな種類のオブジェクトが含まれていますが、代わりにリストを使用するない使用リストにあります。

+0

助けていただきありがとうございます。しかし、リストには2つのオブジェクトが含まれています.ManagerはDepartment –

+0

にキャストできません。実際は:これは良いアプローチではありません。部門とマネージャーを同じリストに入れても意味がありません。あなたは「部門だけ」をソートしたいときに!私の更新された答えを参照してください! – GhostCat

+0

あなたの助けをもう一度ありがとうございます。仕事の一部です。そして、私は2つのオブジェクトのための1つのリストでそれを行う方法がわかりません –

0

同じリストにマネージャーを配置するデザインは、疑わしいと思われます。あなたはTreeウィジェットのモデルを作っていますか?そこそのためのより良い方法がある...いずれにせよ

、あなたは2つのいずれかの操作を行うことができます

  • Comaparatorを提供し、必要に応じて内部のキャスト(悪い考え)
  • または両方の部門を持っており、マネージャはHasDepartmentにgetDepartment()メソッドを実装し、そのためにコンパレータを構築します。「タイプのコレクションのメソッドソート(一覧 、コンパレータ)引数に対して適用されない(リスト 、新しいコンパレータ (){})」
関連する問題