it-swarm.com.de

So sortieren Sie die Arrayliste der Objekte

Ich habe ArrayList, die Fußballmannschaften (Klasse Team) enthält. Teams haben Punkte und ich möchte sie nach Punktanzahl sortieren.

 public class Team {
     private int points;
     private String name;

     public Team(String n)
     {
         name = n;
     }

     public int getPoints
     {
         return points;
     }

     public void addPoints(boolean win)
 {
            if (win==true)
            {
    points = points + 3;
            }

            else if (win==false)
            {
            points = points + 1;
            }

}
 //...
 }

Hauptklasse:

 List<Team> lteams = new ArrayList<Team>;

 lteams.add(new Team("FC Barcelona"));
 lteams.add(new Team("Arsenal FC"));
 lteams.add(new Team("Chelsea"));

 //then adding 3 points to Chelsea and 1 point to Arsenal

 lteams.get(2).addPoints(true);
 lteams.get(1).addPoints(false);

 //And want sort teams by points (first index with most points). 

Ich habe meinen Vergleicher gemacht.

 public class MyComparator implements Comparator<Team> {


    @Override
    public int compare(Team o1, Team o2) {
        if (o1.getPoints() > o2.getPoints())
         {
             return 1;
         }
        else if (o1.getPoints() < o2.getPoints())
        {
            return -1;
        }
        return 0;    
    } 

}

jetzt möchte ich es benutzen (in der Hauptklasse)

 Colections.sort(lteams, new MyComparator());

Ich möchte sehen:

  1. Chelsea
  2. Arsenal
  3. Barcelona

Aber es sortiert nicht.

14
n0hepe

Quelle: hier

Sie können Collections.sort mit einem benutzerdefinierten Comparator<Team> verwenden.

    class Team {
        public final int points;
        // ...
    };

    List<Team> players = // ...

    Collections.sort(players, new Comparator<Team>() {
        @Override public int compare(Team p1, Team p2) {
            return p1.points- p2.points;
        }

    });

Alternativ können Sie auch Team implementsComparable<Team> erstellen. Dies definiert die natürliche Reihenfolge für alle Team-Objekte. Die Verwendung einer Comparator ist flexibler, da verschiedene Implementierungen nach Name, Alter usw. sortieren können.

Siehe auch


Der Vollständigkeit halber sollte ich darauf hinweisen, dass die Verknüpfung return o1.f - o2.f Vergleich durch Subtraktion wegen möglicher Überläufe mit äußerster Vorsicht verwendet werden muss (lesen Sie hierzu Folgendes: Effective Java 2nd Edition: Punkt 12: Erwägen Sie die Implementierung von Comparable). Vermutlich ist Hockey keine Sportart, bei der ein Spieler Tore in der Höhe erzielen kann, die Probleme verursachen würde.

Siehe auch

30
PaRiMaL RaJ
public class Team {
   private int points;
   private String name;

public Team(String n, int p) {
    name = n;
    points = p;
}

public int getPoints() {
    return points;
}

public String getName() {
    return name;
}

public static void main(String[] args) {
    List<Team> lteams = new ArrayList<Team>();

    lteams.add(new Team("FC Barcelona", 0));
    lteams.add(new Team("Arsenal FC", 2));
    lteams.add(new Team("Chelsea", 3));

    Collections.sort(lteams, new MyComparator());

    for (Team lteam : lteams) {
        System.out.println(lteam.name + ": " + lteam.points + " points");
    }
}

}

class MyComparator implements Comparator<Team> {
@Override
public int compare(Team o1, Team o2) {
    if (o1.getPoints() > o2.getPoints()) {
        return -1;
    } else if (o1.getPoints() < o2.getPoints()) {
        return 1;
    }
    return 0;
}}

Ausgabe:
Chelsea: 3 Punkte
Arsenal FC: 2 Punkte
FC Barcelona: 0 Punkte

13
Dmitry Stril

Es ist nicht unbedingt erforderlich, einen benutzerdefinierten Komparator wie folgt zu definieren.

Stattdessen können Sie einfach eine definieren, wenn Sie Ihre ArrayList sortieren möchten.

Seit Java 8 mit Lamda

    // Sort version.
    Iteams.sort(Comparator.comparing(Team::getPoints));

    // Complete version.
    Iteams.sort((o1, o2) -> o1.getPoints().compareTo(o2.getPoints()));


Es gibt auch Optionen für den zweiten Komparator , wenn Objekte auf dem ersten gleich sind: 

    // e.g. if same points, then compare their names.
    Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName));


Beachten Sie auch, dass die Standard-Sortieroptionascendingist. Sie können sie jedoch aufdescendingsetzen, indem Sie:

    // e.g. Sort by points descending.
    Iteams.sort(Comparator.comparing(Team::getPoints).reversed());


Auf diese Weise können Sie Ihre ArrayList jederzeit auf verschiedene Arten sortieren, indem Sie einfach die gewünschte Methode hinzufügen.

0
Lefteris Xris