2016-04-16 6 views
0

Ich habe Probleme bei der Umsetzung meines benutzerdefinierten Komparator für meine Klasse verwenden:Kann benutzerdefinierten Vergleicher in Java

public class MyProject { 
    private static class SuperClass { 
     public SuperClass (ArrayList<Car> cars) { 
      Collections.sort(cars); 
      Collections.sort(cars, new Car.CustomOrder()); 
     } 
    } 

    public final static class Car implements Comparable<Car> { 
     public Comparator<Car> customOrder() { 
      return new CustomOrder(); 
     } 

     public class CustomOrder implements Comparator<Car> { 
      public int compare(Car c1, Car c2) { 
       // some code 
       return 1; 
     } 
    } 
} 

Ich mochte Autos CustomOrder durch benutzerdefinierten Komparator sortieren. Ich kann meinen Fehler nicht finden, also bitte hilf mir.

+2

Dieser Code ist voll mit nicht kompilierbarem Code. Hast du die Fehlermeldungen vom Compiler gelesen? Was sagen Sie? Was verstehst du nicht? Warum denkst du, dass es eine gute Idee ist, alle deine Klassen so zu nisten? –

+0

Was ist Auto ... oder spezifischer: Was hat Auto für Felder, die Sie auf eine benutzerdefinierte Bestellung beziehen können? –

+0

Auch macht es (zumindest für mich) keinen Sinn, 'sort()' im ctor der SuperClass zu nennen. Dies wird von der Klasse "Comparator" nicht benötigt, und es macht keinen Sinn, eine Sortieroperation wie diese in einem Komparator zu erzwingen. – markspace

Antwort

2
  1. Sie haben public int compareTo(Car o) in Car Klasse implementieren Ihr Programm zu kompilieren.

  2. Collections.sort(cars, new Car().new CustomOrder());, weil CustomOrder eine innere Klasse ist, keine statisch verschachtelte. Es kann durch den vorhandenen Verweis auf die äußere Klasse erstellt werden.

Eine Instanz einer inneren Klasse kann nur innerhalb einer Instanz eines äußeren Klasse existieren und direkten Zugang zu den Methoden und Felder seiner umschließenden Instanz besitzt.


Es scheint, dass Sie innere und verschachtelte Klassen nicht vollständig verstehen. Ich schlage vor, über Oracle Tutorials über them zu lesen.

+3

Während du richtig sagst, dass eine neue CustomOrder so erstellt werden kann, denke ich, du solltest auch sagen, dass es wahrscheinlich ein schreckliches Design für das OP ist, seine Klassen auf diese Weise zu verschachteln. – markspace

1

Wie Andrew Toblko vorgeschlagen hat, müssen Sie die Methode compareTo in der Klasse Auto implementieren, da Sie Autoobjekte vergleichen möchten.

Werfen Sie einen Blick auf den Link Java Object Sorting

Geben Sie bitte auch, sauberen Code schreiben. Ihr Code ist schwer zu lesen, obwohl er kurz ist.

1

Versuchen Sie, das statische Schlüsselwort loszuwerden, das ist kein schöner Weg zu gehen und kann leicht in einem schlechten Entwurfsmuster werden.

Sie haben die Klasse Auto, und eine Liste der irgendwo, so unabhängig davon, ob das Auto Geräte oder nicht vergleichbar, einen anonym man verwenden kann und verwenden Sie die Felder, die Sie für die Sortierkriterien müssen ...

Beispiel:

Sortieren der Liste von OrderId (nur ein String)

public static void main(String[] args) { 
    List<Car> myCars = new ArrayList<>(); 
    myCars.add(new Car(0, "qqweqw", "qwe")); 
    myCars.add(new Car(1, "Aqqweqw", "qwe")); 
    myCars.add(new Car(2, "Zqqweqw", "qwe")); 

    System.out.println("unsorted list" + myCars); 
    Collections.sort(myCars, new Comparator<Car>() { 

     @Override 
     public int compare(Car o1, Car o2) { 
      return o1.getOrder().compareTo(o2.getOrder()); 
     } 
    }); 
    System.out.println("sorted list" + myCars); 

} 

dann als yo sehen können, keine Notwendigkeit, einen neuen Komparator erklären Klasse, die Abhängigkeiten an die Car-Klasse bindet

+0

Ich würde lieber ein Lambda schreiben als die anonyme Klasse – Andrew

+1

würde ich, aber ich konnte nicht finden, ob Java 8 erlaubt ist .... danke für die Kommentare –

Verwandte Themen