У меня есть два списка ArrayList, один из которых содержит названия команд (строки), а другой - общее количество очков соответствующей команды (целые числа). Я хочу отсортировать баллы от самого высокого к самому низкому, сохраняя при этом счет в соответствии с названием команды.
Я недостаточно знаком с программированием в целом, чтобы знать, как к этому подойти, и не смог найти здесь ничего подходящего.
ArrayList<String> nameList = new ArrayList<String>();
ArrayList<Integer> pointsList = new ArrayList<Integer>();
for (int i = 0; i < competitionList.size(); i++)
{
int pointTotal = 0;
if (nameList.contains(competitionList.get(i).getTeam()))
{
}
else
{
nameList.add(competitionList.get(i).getTeam());
for (int a = 0; a < competitionList.size(); a++)
{
if (competitionList.get(a).getTeam().equals(competitionList.get(i).getTeam()))
{
pointTotal += competitionList.get(a).getPoints();
}
}
pointsList.add(pointTotal);
}
И затем пытаюсь отсортировать здесь
Я могу изменить его так, чтобы данные вводились в ArrayList<Object>, где каждый модуль будет «TeamNameExample IntExample», но я не знаю, как мне их отсортировать?
Как бы вы хотели это отсортировать? В алфавитном порядке по названию команды? Численно по командному счету? Вам следует создать компаратор, чтобы определить это и передать его в функцию сортировки. Если только вы не хотите вручную сортировать его вручную.
Да, как уже говорили другие, вам следует создать класс (или запись), например record Team(String name, int points) { }
, а затем отсортировать его.
Упорядочение очков команд от самого высокого до самого низкого, с указанием названия соответствующей команды рядом с результатом. Отобразит его на JDialogueBox как список с наивысшими баллами.
import java.util.ArrayList;
public class Test {
static class Obj {
String name;
Integer point;
@Override
public String toString() {
return "name: " + name + ", point: " + point;
}
}
public static void main(String[] args) {
ArrayList<Obj> objList = new ArrayList<>();
Obj obj = new Obj();
obj.name = "1";
obj.point = 100;
objList.add(obj);
obj = new Obj();
obj.name = "2";
obj.point = 20;
objList.add(obj);
obj = new Obj();
obj.name = "3";
obj.point = 30;
objList.add(obj);
// 100,30,20
objList.sort((a,b) -> b.point - a.point);
// 20,30,100
// objList.sort((a,b) -> a.point - b.point);
System.out.println(objList);
}
}
Что ж, в этом примере есть место для улучшений: «Obj» — ужасное имя для класса; доступ к полям объекта является антишаблоном в ООП, лучше иметь геттеры и сеттеры!
@GyroGearless Да. Я ленив.
Лучше написать пару предложений, объясняющих ваше решение.
Шаг 1: подсчитайте общее количество очков каждой команды.
шаг 2: сортировка по баллам
public class Test {
public static void main(String[] args) {
List<CompetitionRecord> competitionList = new ArrayList<>();
competitionList.add(new CompetitionRecord("teamA", 10));
competitionList.add(new CompetitionRecord("teamB", 30));
competitionList.add(new CompetitionRecord("teamB", 20));
competitionList.add(new CompetitionRecord("teamC", 40));
// tally the total points of each team
Map<String, Integer> teamToPointsMap = new HashMap<>();
for (CompetitionRecord competitionRecord : competitionList) {
String team = competitionRecord.getTeam();
Integer points = competitionRecord.getPoints();
Integer oldPoints = teamToPointsMap.getOrDefault(team, 0);
teamToPointsMap.put(team, oldPoints + points);
}
// sort by value(points)
List<Map.Entry<String, Integer>> sortedList = teamToPointsMap.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.toList();
// print result
for (int i = 0; i < sortedList.size(); i++) {
Map.Entry<String, Integer> entry = sortedList.get(i);
System.out.println("i = " + i + ", team = " + entry.getKey() + ", points = " + entry.getValue());
}
/*
output:
i=0, team=teamB, points=50
i=1, team=teamC, points=40
i=2, team=teamA, points=10
*/
}
record CompetitionRecord(String team, Integer points) {
public String getTeam() {
return team;
}
public Integer getPoints() {
return points;
}
}
}
Определите класс записи для хранения совпадающих значений из каждого массива.
record Team ( String name , int points ) {}
Составьте список этих объектов.
List < Team > teams = new ArrayList <> () ;
Зацикливайте входные массивы, создавая экземпляр объекта Team
для каждой строки.
teams.add( new Team( nameArray[ index ] , pointsArray[ index ] ) ) ;
Comparator
Определите Компаратор для сортировки.
teams.sort(
Comparator
.comparing( Team :: points )
.reversed()
);
вместо сортировки двух списков вместе. Лучшим подходом является инкапсуляция ваших данных. Преобразуйте пару строк и целых чисел в POJO, который представляет команду и их очки, и сохраните в списке. Затем отсортируйте этот список.