2016-04-23 7 views
1

Ich verwende Verarbeitung.Wie sortieren Sie eine Sammlung eines benutzerdefinierten Objekts durch ein Feld, das selbst ein Objekt ist Java

public void sortEnemies(final String field, List<Enemy> itemLocationList) { 
    Collections.sort(itemLocationList, new Comparator<Enemy>() { 
     @Override 
     public int compare(Enemy o1, Enemy o2) { 
     if (field.equals("r")) { 
      if (o1.r<o2.r) 
      { 
      return -1; 
      } 
      if (o1.r>o2.r) 
      { 
      return 1; 
      } 
      if (o1.r==o2.r) 
      { 
      return 0; 
      } 
     } 

     println("shoudl not have reached here."); 
     return 0; 
     } 
    } 
    ); 
    } 

Es ist einfach genug, um einen Komparator zu verwenden, um diese Feinde zu sortieren i von einem primitiven Feld wie ihr Radius r haben. Was ich tun möchte, ist folgendes: Jeder Gegner hat ein PVector-Objekt namens loc innerhalb von ihm, das primitive Felder loc.x und loc.y hat. Wie würde ich diesen Code ändern, um nach dem PVector-Objekt im Objekt zu sortieren? Ist das möglich? Ich möchte zum Beispiel nur nach ihrer X- oder Y-Koordinate sortieren, aber ich bin mir nicht sicher, wie ich es auf ähnliche Weise schreiben soll.

Im Wesentlichen ist die Frage: Wie sortiere ich ein Array von Objekten durch ein Feld, das selbst ein Objekt ist, das das Feld hat, nach dem ich sortieren möchte.

edit: ich sehe, dass es hier ein ähnliches Problem Sort ArrayList of custom Objects by property

ist, aber ich will nicht Lambda-Notation verwenden, da ich Verarbeitung verwendet 8 Java nicht denken (nicht sicher). Ich kann die PVector-Klasse nicht ändern. Ich habe einen Weg gefunden, eine Liste von PVector-Objekten zu sortieren, aber es scheint, als wäre es eine sehr umständliche Art, eine Liste der Feinde zu erstellen, die Indizes zu erhalten und dann die Feinde mit diesen Indizes zu sortieren.

+0

Verwenden Sie Java 8 oder etwas niedriger? –

+0

Ich benutze jede Version von Java, die mit Processing 3.0 kommt. Tut mir leid, ich habe nicht in diese – user3772547

+0

untersucht Eigentlich, Java und Verarbeitung [sind nicht die gleiche Sache.] (Http://meta.stackoverflow.com/q/321127/472647) – CodeMouse92

Antwort

1

Aus dem Kommentar-Feed:

Ich möchte ein String-Feld genannt passieren, wo ich sortEnemies ('x', listofenemies) sagen kann; und auch sortEnemies ('r', listofenemies);

Ich würde vorschlagen, eine Zuordnung der Feldnamen zu Komparatoren machen, etwa so:

Map<String, Comparator<Enemy>> comparators = new HashMap<>(); 

comparators.put("health", new Comparator<Enemy>() { 
    @Override 
    public int compare(Enemy o1, Enemy o2) { 
     if (o1.health < o2.health) 
      return -1; 
     if (o1.health > o2.health) 
      return 1; 
     return 0; 
    } 
}); 

comparators.put("x", new Comparator<Enemy>(){ 
    @Override 
    public int compare(Enemy o1, Enemy o2) { 
     if (o1.loc.x < o2.loc.x) 
      return -1; 
     if (o1.loc.x > o2.loc.x) 
      return 1; 
     return 0; 
    } 
}); 

Wenn Sie möchten, dass Ihre Elemente sortieren, den entsprechenden Komparator mit Namen erhalten:

Comparator<Enemy> comparator = comparators.get("x"); 
if (comparator == null) 
    throw new RuntimeException("No such comparator exists!"); 
Collections.sort(itemLocationList, comparator); 

Ich würde vorschlagen, den Namen vollständig zu qualifizieren, dh "loc.x" als Namen und nicht nur "x" zu verwenden, obwohl es alles sein kann, was Sie möchten, solange Sie denselben Namen verwenden, wenn Sie ihn eingeben und abrufen aus.

Diese Antwort ist etwas anders als die ursprüngliche Antwort, aber Sie können die verschiedenen Versionen sehen, indem Sie unten auf den Link 'editiert' klicken.

+0

Ich akzeptiere die Antwort, weil es funktioniert hat. (Sie müssen nur die o1.r in Ihrem Beispiel an o1.x anpassen und vielleicht Enemey in Enemy umbenennen). Nur zur Klarstellung, um nach anderen Feldern sortieren zu können, muss ich nur neue Vergleichsmethoden hinzufügen oder füge einfach ein Feld namens String hinzu und mache dann das, was ich oben in meinem Beispiel getan habe. – user3772547

+0

Ich bin mir nicht sicher, ob ich das letzte bisschen verstehe ... Ich werde die Antwort aktualisieren, aber noch einmal kommentieren, wenn es immer noch nicht klar ist. –

+0

Sorry, lass mich es auf eine andere Art und Weise sagen. Ich möchte ein String-Feld übergeben, wo ich sortEnemies sagen kann ('x', listofenemies); und auch sortEnemies ('r', listofenemies); x ist das Mitglied des Pvectors, was wir getan haben. aber r ist ein Mitglied des Feindes. Muss ich eine andere Vergleichsmethode implementieren, weil die Methodensignatur anders ist? – user3772547