2017-02-11 5 views
4

私はかなり新しいJavaです。今ではいくつかのComparatorクラスを作成する必要があります。JavaのComparatorクラスでラムダ式を使うにはどうすればいいですか?

このStackoverflowページでは、ラムダ式の使用に関するいくつかの有用な情報が見つかりました。私はfotosCollectionと呼ばれるコレクションを持っているときに、私はこれを行うことができるようにしたいと思い

public class WidthComparator implements Comparator{ 
    @Override 
    public int compare(Object t, Object t1) { 
     Foto foto1 = (Foto)t; 
     Foto foto2 = (Foto)t1; 

     return Comparator.comparing(Foto::getWidth) 
       .thenComparing(Foto::getHeight) 
       .thenComparingInt(Foto::getName); 
     } 
    }  
} 

fotosCollection.sort(new HoogteComparator()); 

私にこのようCompartorクラスの作成についての事をしたHow to compare objects by multiple fields

これは明らかにうまくいきませんが、どうすればこの問題を解決できますか?

ps。コンパレータクラスを使用する必要があります。

+2

fotosCollection.sort(Comparator.comparing(Foto :: getName)); '.comComparing(Foto :: getHeight) .thenComparingInt(Foto :: getName));'。 –

答えて

2

あなたが本当にし、比較の種類をしたくない場合何らかの理由で匿名にすることができます:

public class WidthComparator implements Comparator<Foto>{ 
    private final static Comparator<Foto> FOTO_COMPARATOR = Comparator.comparing(Foto::getWidth) 
     .thenComparing(Foto::getHeight) 
     .thenComparingInt(Foto::getName); 

    @Override 
    public int compare(Foto foto1, Foto foto2) {  
     return FOTO_COMPARATOR.compare(foto1, foto2);   
    }  
} 

私もそうです。 onsiderはrawtypeの使用を避け、代わりに上記のようにComparator<Foto>を実装します。

+0

これは期待どおりに動作します。私は学校の割り当てのためにこれを行う必要があるので、コンパレータクラスの実装を使用する必要があります。 'Comparator 'はどのように実装できますか? –

+1

@JohanVergeer私はそれに応じて私の答えを編集しました。 – Calculator

+0

これは意味をなさない。 'Comparator.comparing(Foto :: getWidth).thenComparing(Foto :: getHeight).thenComparingInt(Foto :: getName)'という表現は、実際の作業を行う 'Comparator'を既に作成しています。 'WidthComparator'クラスは時代遅れです。すべてのidは、比較のたびに新しいコンパレータを作成しています。 – Holger

1

あなたはこの古いスタイルのアプローチ試すことができます:Comparatorを返し

public class WidthComparator implements Comparator{ 
    @Override 
    public int compare(Object t, Object t1) { 
     Foto foto1 = (Foto)t; 
     Foto foto2 = (Foto)t1; 

     // width asc order 
     if(foto1.getWidth() != foto2.getWidth()) 
      return foto1.getWidth() - foto2.getWidth(); 

     // height asc order 
     if(foto1.getHeight() != foto2.getHeight()) 
      return foto1.getHeight() - foto2.getHeight(); 

     // name asc order 
     return foto1.getName().compareTo(foto2.getName());    
    }  
} 
+4

生タイプを使用した回答は投稿しないでください。 –

5

Comparator.comapringを - あなただけのそれを直接使用することができます。

// Define a "constant" comparator 
private static final Comparator<Foo> HOOGTE_COMPARATOR = 
    Comparator.comparing(Foto::getWidth) 
       .thenComparing(Foto::getHeight) 
       .thenComparingInt(Foto::getName); 

// Use it elsewhere in your code 
fotosCollection.sort(HOOGTE_COMPARATOR); 
+0

コンパレータのサブクラスを使用する必要がなければ、これが正解となることはわかっています。しかし、この任務のために、私はする必要があります。 –

+3

@JohanVergeerですが、**これは**コンパレータです。あなた自身でボイラープレートコードを書くのではなく、それを生成するためにファクトリメソッドを使用するという事実は、これを変更しません。 – Mureinik

関連する問題