2016-10-01 4 views
4

Ich habe eine Implementierung von Comparator<Entity> erstellt, aber wenn ich diesen Komparator verwenden, um eine Array<Entity> zu sortieren. Ich werde eine java.lang.NullPointerException erhalten, weil, wenn ich die Entität zu einer statischen Sammlungen zuordnen, die bereits entfernt wird. Jetzt ist mein Problem, ich weiß nicht, was ich zurückgeben soll, um die Vergleichsmethode zu überspringen.Wie behandelt man null Methodenvergleichsargumente in 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

Siehe http://stackoverflow.com/questions/2401606/comparator-with-null-values ​​ – c0der

+0

Dies kann nur passieren, wenn Ihr 'Array' null Elemente enthält. Lösung: nicht. – EJP

Antwort

12

Sie können den Vergleich nicht "überspringen". Was würden Sie von dem Sortiercode erwarten? Du musst es mit einem Ergebnis versehen.

Zwei Optionen sind gemeinsam:

  • eine NullPointerException werfen, um anzuzeigen, dass Sie unterstützen nicht nur null Werte zu vergleichen. Das ist ausdrücklich eine Option in der compare Dokumentation
  • Entscheiden Sie, dass null bevor alles kommt anders, aber gleich selbst

Letztere Implementierung wäre so etwas wie:

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

Kannst du beschreiben, was bedeutet 0, -1, 1? Danke, es hilft sehr! –

+0

@RonJuneLopez: Hast du die Dokumentation gelesen? Wenn ja, welcher Teil dieser Beschreibung des Rückgabewerts ergab keinen Sinn? Es ist schwer, eine zweite Erklärung zu geben, ohne zu wissen, welcher Teil der ersten Erklärung für Sie keinen Sinn ergibt - und die Dokumentation sollte ** immer ** der erste Ort sein, an dem Sie suchen. –

2

auf Jons Antwort zu erarbeiten und beantworte Rons Frage, man sollte sich immer erst die Spezifikation ansehen, bevor man sich entscheidet, was zu tun ist. In diesem Fall heißt es "Anders als vergleichbar, kann ein Komparator optional einen Vergleich von Nullargumenten erlauben, während die Anforderungen für eine Äquivalenzbeziehung beibehalten werden." Siehe the comparator API. Es erklärt, was gemeint ist. Ich kann keine andere vernünftige Lösung sehen.

Verwandte Themen