2017-11-19 1 views
-1

Also in meinem Programm sortiere ich Objekte nach Datum und es gibt auch eine Option für nie Ich möchte meine Liste so bestellt werden nie, nie, 1/23/12,1/24/12,2/2/16.Kann nicht eine Super-Methode verweisen

Es bestellt alles was ich mag außer es setzt das nie am ende.

Ich bestelle durch Aufruf von Collections.sort (ArrayList); Ich habe gelernt, dass Sie einen benutzerdefinierten Komparator erstellen können und ich will nur in die nie ersten sein, aber ich kann nicht einen Super-Camparator Reference sagen, kann nicht direkt die abstrakte Methode Compare (Object, Object) für den Typ Comparator < 0bject> Do Sie aufrufen Wie kann ich das zur Arbeit bringen? Gibt es eine bessere Möglichkeit, Arrays zu sortieren, oder muss ich sie einfach komplett erstellen?

class Test2 implements Comparator<Object> 
{ 

@Override 
public int compare(Object arg0, Object arg1) { 

    // TODO Auto-generated method stub 
    int other; 
    if (arg0.equals("never")&&!arg1.equals("never")) 
    { 
     return 1; 
    }else if(!arg0.equals("never")&&arg1.equals("never")) 
    { 

     return -1; 
    }else if(arg0.equals("never")&&arg1.equals("never")) 
    { 

     return 0; 
    }else 
    { 
     other = Comparator.super.compare(arg0,arg1); 
    } 

    return other; 
} 

}

+4

Es gibt keine Super-Methode zum Aufruf, wenn Sie direkt eine Methode auf einer Schnittstelle implementieren – jontro

+0

Was sind Ihre tatsächlichen Objekte? – Oleg

+0

Auch wenn dies funktioniert, würde es wahrscheinlich den Vertrag von "Comparator" verletzen. –

Antwort

0

Ich vermute, dass die Liste der ‚Termine‘ ist eigentlich eine Liste von String-Objekten und zur Zeit Sie wie diese sind Sortierung:

 List<String> dates = ...; 
     Collections.sort(dates); 

das funktioniert, weil die String-Klasse, die Comparable-Schnittstelle implementiert. Zusammen

 java.util.Comparator; and 
     java.util.Comparable 

sind die beiden Möglichkeiten, den Collections.sort zur Arbeit zu kommen. Um eine benutzerdefinierte zu implementieren Art können Sie in der Tat Vergleicher implementieren wie Sie versuchen, aber die Superklasse von Ihrem Beispiel ist

 java.lang.Object 

was ein Grund dafür ist, dass Sie nicht in der Lage sein, Ihren Code zu kompilieren, weil es keine vergleichen (Objekt, Objekt) Methode für Objekt.

Um auf die Methode 'compare' zu verweisen, die standardmäßig ausgeführt wird, können Sie die Methode String compareTo direkt verwenden. Dies könnte wie folgt aussehen:

public class NeverComparator implements Comparator<String> { 
    private static String NEVER = "never"; 

    @Override 
    public int compare(String o1, String o2) { 
     if (NEVER.equals(o1)) { 
      return NEVER.equals(o2) ? 0 : -1; 
     } 
     if (NEVER.equals(o2)) { 
      return 1; 
     } 
     return o1.compareTo(o2); 
    } 
} 

Nachdem dies jedoch gesagt wurde. Wenn Sie versuchen, die Daten auf diese Weise zu sortieren, werden Sie feststellen, dass Ihr Beispiel nur mit Zufallsgenerator funktioniert und Sie einige Arbeiten ausführen müssen, um Ihre String-Daten richtig zu vergleichen.

+0

Ich habe es am Ende so gelöst. Ich hatte versucht, Strings zu vergleichen und vergaß, dass sie das bereits verglichen hatten. – Austin

0

Vergleicher ist die Klasse, die Sie erstreckt, nicht die Implementierung, die Super Sie anrufen möchten, ist aus dem eigenen Objekt ist super.

other = Test2.super.compare(arg0,arg1) 

Aber da Sie die vergleichen zwingende und die Klasse ist nicht außerhalb des Bereichs können Sie den Klassennamen ommit (es sei denn, in einer inneren Klasse):

other = super.compare(arg0,arg1) 
0

Um nur Vorkommen von "Never" nach vorne zu bewegen, ohne die relative Reihenfolge der anderen Einträge zu ändern, Sie

yourArrayList.sort(Comparator.comparing(s -> !s.equals("Never"))); 

Um dies zu kombinieren mit Sortieren der anderen Strings lexikographisch verwenden können, können Sie

verwenden
yourArrayList.sort(Comparator.comparing((String s) -> !s.equals("Never")) 
          .thenComparing(Comparator.naturalOrder())); 

Diese Lösung ist äquivalent zu

yourArrayList.sort(new Comparator<String>() { 
    @Override 
    public int compare(String o1, String o2) { 
     int step1 = ((Boolean)!o1.equals("Never")).compareTo(!o2.equals("Never")); 
     return step1!=0? step1: o1.compareTo(o2); 
    } 
}); 

Es muss jedoch betont werden, dass das lexikografische Sortieren von Strings nicht die chronologische Reihenfolge der darin enthaltenen Daten angibt. Um sie chronologisch zu sortieren, gibt es keine Möglichkeit, die Daten zu analysieren, z.

+0

So wie ich meine Daten formatiert habe funktioniert es yyyy/MM/dd_hh/MM/ss – Austin

+0

So sind Ihre Beispiele in Ihrer Frage nicht formatiert. Wenn jedoch die String-Sortierung für Sie funktioniert, gibt es zu Beginn meiner Antwort einen One-Liner (oder zwei Liner), der die Aufgabe löst ... – Holger

Verwandte Themen