¿Cómo ordenar una lista de objetos por una propiedad?

Digamos que tienes un Arraylist de objetos de HockeyPlayer .

¿Cómo podría ordenar eso si todos tienen una variable int goalsScored ? ¿Cómo podrías ordenarlos por goalsScored?

Puede usar Collections.sort con un Comparator personalizado Comparator .

  class HockeyPlayer { public final int goalsScored; // ... }; List players = // ... Collections.sort(players, new Comparator() { @Override public int compare(HockeyPlayer p1, HockeyPlayer p2) { return p1.goalsScored - p2.goalsScored; // Ascending } }); 

La parte de comparación también se puede escribir de esta manera:

 players.sort(Comparator.comparingInt(HockeyPLayer::goalsScored)); 

Alternativamente, puede hacer que HockeyPlayer implements Comparable . Esto define el orden natural para todos los objetos de HockeyPlayer . El uso de un Comparator es más flexible ya que las diferentes implementaciones pueden ordenarse por nombre, edad, etc.

Ver también

  • Java: ¿Cuál es la diferencia entre implementar Comparable y Comparator ?

Para completar, debo advertir que el return o1.f - o2.f comparación por sustracción debe usarse con extrema precaución debido a posibles desbordamientos (léase: Edición efectiva de Java 2da: Punto 12: Considere implementar Comparable ). Es de suponer que el hockey no es un deporte donde un jugador puede anotar goles en la cantidad que causaría problemas =)

Ver también

  • Java Integer: ¿qué es una comparación o sustracción más rápida?

Como @ user6158055 sugiere, es un trazador de líneas con Java 8 , de la siguiente manera:

 Collections.sort( hockeyPlayerList, (player1, player2) -> player1.getGoalsScored() - player2.getGoalsScored()); 

Ejemplo completo para representar lo mismo:

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { List hockeyPlayerList = new ArrayList<>(); hockeyPlayerList.add(new HockeyPlayer("A", 3)); hockeyPlayerList.add(new HockeyPlayer("D", 10)); hockeyPlayerList.add(new HockeyPlayer("B", 2)); System.out.println("Before Sort based on goalsScored\n"); hockeyPlayerList.forEach(System.out::println); System.out.println("\nAfter Sort based on goalsScored\n"); Collections.sort( hockeyPlayerList, (player1, player2) -> player1.getGoalsScored() - player2.getGoalsScored()); hockeyPlayerList.forEach(System.out::println); } static class HockeyPlayer { private String name; private int goalsScored; public HockeyPlayer(final String name, final int goalsScored) { this.name = name; this.goalsScored = goalsScored; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getGoalsScored() { return goalsScored; } public void setGoalsScored(int goalsScored) { this.goalsScored = goalsScored; } @Override public String toString() { return "HockeyPlayer [name=" + name + ", goalsScored=" + goalsScored + "]"; } } } 

Salida :

 Before Sort based on goalsScored HockeyPlayer [name=A, goalsScored=3] HockeyPlayer [name=D, goalsScored=10] HockeyPlayer [name=B, goalsScored=2] After Sort based on goalsScored HockeyPlayer [name=B, goalsScored=2] HockeyPlayer [name=A, goalsScored=3] HockeyPlayer [name=D, goalsScored=10] 

Escriba un comparador personalizado para hacer el trabajo.

Use un comparador genérico como el comparador de frijoles .

Solo una línea con Java 8:

 Collections.sort(players, (p1, p2) -> p1.getGoalsScored() - p2.getGoalsScored()); 

Java tiene un conjunto de métodos de ordenación (sort) para este tipo de cosas. Ver Collections.sort (y Comparable) para más detalles.