2016-10-01 1 views
4

Comparator<Entity>の実装を作成しましたが、このコンパレータを使用してArray<Entity>をソートすると、私はjava.lang.NullPointerExceptionを受け取ります。なぜなら、エンティティを既に削除された静的コレクションにマップするときです。今私の問題は、私が比較メソッドをスキップするために何を返すのか分からないということです。Comparatorでヌル比較メソッドの引数を処理する方法は?

public class CustomComparator implements Comparator<Entity> { 

    public int compare(Entity e1, Entity e2) { 
     if(e1== null || e2 == null) { 
      return // don't know what to return to skip this method; 
     } 

     Vector2 e1Pos = Mapper.transform.get(e1).position; 
     Vector2 e2Pos = Mapper.transform.get(e2).position; 

    } 

} 
+0

http://stackoverflow.com/questions/2401606/comparator-with-null-valuesを参照してください。 – c0der

+0

これは、「配列」にnull要素が含まれている場合にのみ発生します。解決策:しないでください。 – EJP

答えて

12

比較をスキップすることはできません。並べ替えのコードが何をすると思いますか?あなたは結果を提供しなければなりません。

つのオプションが共通しています

  • は、あなただけのnull値の比較をサポートしていないことを示すためにNullPointerExceptionを投げます。これは、明示的に
  • nullは、他のすべての前に来ることを決めcompareドキュメントのオプションだが、それ自体に等しい

後者の実装は、何かのようになります:Jonの答えに詳述すると

public int compare(Entity e1, Entity e2) { 
    if (e1 == e2) { 
     return 0; 
    } 
    if (e1 == null) { 
     return -1; 
    } 
    if (e2 == null) { 
     return 1; 
    } 
    Vector2 e1Pos = Mapper.transform.get(e1).position; 
    Vector2 e2Pos = Mapper.transform.get(e2).position; 
    return ...; 
} 
+0

0、-1、1の意味は何ですか?それは多くの助けてくれてありがとう! –

+0

@RonJuneLopez:ドキュメントを読んだことはありますか?もしそうなら、戻り値の記述のどの部分が意味をなさないのでしょうか?最初の説明のどの部分があなたにとって意味をなさないのか分からずに2番目の説明をするのは難しいです。ドキュメントは常に**あなたが目にする最初の場所にすべきです。 –

2

Ronの質問に答えるには、何をすべきかを決める前に常に仕様を見なければならない。この場合、「Comparableとは異なり、Comparatorは、等価関係の要件を維持しながら、null引数の比較をオプションで許可することができます」と述べています。 the comparator APIを参照してください。それは何を意味するのかを詳しく説明します。私は他の合理的な解決法は見当たりません。

関連する問題