ich habe eine ArrayList aus mehreren Objekten. Jedes dieser Objekte hat eine Nummer.
Nun möchte ich, mir sagen wir zwei beliebige ( bei 10 Objekten Nr.2 und Nr.7) Objekte aus der Liste rausnehmen und wissen welches die kleinere Nummer besitzt.
Naja. Also Nr 2 ist kleiner. Es sind aber nicht immer nur zwei vergleichsparameter sondern ab 2 oben erstmal offen.
Und ja , der relevante Inhalt ist ja die Objektnummer (im Konstruktor des Objekts hochgezählt) was ich vergleiche.
Das Frage ich mich auch. Das Comparable-Interface nutzt man ja nicht für eine bestimmte Collection, sondern man legt damit die "natürliche Anordnung" einer Klasse fest - sprich wie Instanzen dieser Klasse sortiert werden sollen.
classObjektimplementsComparable<Objekt>{privatestaticint objekte;privateint objektNr;publicObjekt(int nr){
objektNr = objekte++;}//EDIT: die brauchen wir auch noch:publicintgetObjektNr(){return objektNr;}publicintcompareTo(Objekt o){return objektNr - o.objektNr;}}
Java:
Objekt o1 = liste.get(2);Objekt o2 = liste.get(7);int result = o1.compareTo(o2);String op = result <0?"<":(result >0?">":" == ");System.out.printf("%d in Liste (Index 2) %s %d in Liste (Index 7)\n",
o1.getObjektNr(), op, o2.getObjektNr());
privateArrayList<Peasant> peasants =newArrayList<Peasant>();privateComparator<Peasant> peasantSorter =newComparator<Peasant>(){@Overridepublicintcompare(Peasant p0,Peasant p1){returnInteger.valueOf(p0.peasantid).compareTo(p1.peasantid);//nach kleinster id sortieren, sodass
das erste element die kleinste id ist
}};for(int i =0;i<peasants.size();i++){if(peasants.get(i).isMarked()){//die Objekte auswählen die sortiert werden sollenCollections.sort(peasants,nodeSorter);//List sortierenSystem.out.println(peasants.get(i).peasantid);//zeigt mir die ids der markierten Objekte anif(peasants.get(0).isGo()){//erstes Objekt aufgreifen//der boolean go wert wird auf true gesetzt wenn sich vor dem einen Sprite ein anderes steht//es geht dabei darum wer zuerst laufen darf
peasants.get(0).move(xoffset,yoffset);// bewegen}else{
peasants.get(i).move(xoffset,yoffset);// ansonsten immer bewegen}}}
Du gehst mit einer Schleife durch alle Peasants und sortierst die gesamte Liste innerhalb der Schleife jedes mal, wenn "isMarked" gesetzt ist. Ändert sich denn innerhalb der Schleife etwas an der Liste? Es reicht doch aus, die Liste einmal vor der Schleife zu sortieren.
Doch tut sie, allerdings erst ab Java 8. Hätte ich vielleicht erwähnen sollen.
Falls eine niedrigere Version zum Einsatz kommt ist mein Kommentar hinfällig.
Was mir aber gerade noch auffällt, von EichelHäer der gezeigte Comparator heißt peasantSorter aber in der Schleife verwendet er nodeSorter. Was ist denn nun der nodeSorter?