Как сортировать Arraylist объектов
У меня есть ArrayList, который содержит футбольные команды (класс Team). У команд есть очки, и я хочу сортировать их по количеству баллов.
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;
}
}
//...
}
Основной класс:
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).
Я сделал свой компаратор.
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;
}
}
теперь я хочу использовать его (в основном классе)
Colections.sort(lteams, new MyComparator());
Я хочу видеть:
Но он не сортируется.
Ответы
Ответ 1
Источник: Здесь
Вы можете использовать Collections.sort
с помощью Comparator<Team>
.
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;
}
});
В качестве альтернативы вы можете сделать Team implements
Comparable<Team>
. Это определяет естественный порядок для всех объектов Team
. Использование Comparator
более гибко в том, что различные реализации могут упорядочиваться по имени, возрасту и т.д.
См. также
Для полноты я должен предупредить, что ярлык сравнения return o1.f - o2.f
по вычитанию должен использоваться с особой осторожностью из-за возможных переполнений (см. "Эффективное Java 2nd Edition: Пункт 12: Рассмотрите возможность внедрения Comparable
). Предположительно, хоккей - это не спорт, где игрок может забивать голы в количестве, которое может вызвать проблемы. =)
См. также
Ответ 2
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;
}}
Вывод:
Челси: 3 очка
" Арсенал": 2 очка
" Барселона": 0 очков.
Ответ 3
На самом деле нет необходимости определять пользовательский Компаратор следующим образом.
Вместо этого вы можете легко определить его, когда хотите отсортировать ArrayList.
Поскольку JAVA 8 с использованием lamda
// Sort version.
Iteams.sort(Comparator.comparing(Team::getPoints));
// Complete version.
Iteams.sort((o1, o2) -> o1.getPoints().compareTo(o2.getPoints()));
Также есть опции для второго компаратора, если объекты равны на первом:
// e.g. if same points, then compare their names.
Iteams.sort(Comparator.comparing(Team::getPoints).thenComparing(Team::getName));
Также обратите внимание, что параметр сортировки по умолчанию возрастает, но вы можете установить его по убыванию, используя:
// e.g. Sort by points descending.
Iteams.sort(Comparator.comparing(Team::getPoints).reversed());
Таким образом, вы можете сортировать ArrayList по-разному, когда захотите, просто добавив метод, который вы хотите.
Ответ 4
Используйте эту ссылку, и вы найдете ответ this