Одновременная сортировка двух ArrayLists в Java

У меня есть два списка 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);
    }

И затем пытаюсь отсортировать здесь

вместо сортировки двух списков вместе. Лучшим подходом является инкапсуляция ваших данных. Преобразуйте пару строк и целых чисел в POJO, который представляет команду и их очки, и сохраните в списке. Затем отсортируйте этот список.

pebble unit 03.09.2024 08:20

Я могу изменить его так, чтобы данные вводились в ArrayList<Object>, где каждый модуль будет «TeamNameExample IntExample», но я не знаю, как мне их отсортировать?

CJ Forrester 03.09.2024 08:34

Как бы вы хотели это отсортировать? В алфавитном порядке по названию команды? Численно по командному счету? Вам следует создать компаратор, чтобы определить это и передать его в функцию сортировки. Если только вы не хотите вручную сортировать его вручную.

pebble unit 03.09.2024 08:42

Да, как уже говорили другие, вам следует создать класс (или запись), например record Team(String name, int points) { }, а затем отсортировать его.

MC Emperor 03.09.2024 08:50

Упорядочение очков команд от самого высокого до самого низкого, с указанием названия соответствующей команды рядом с результатом. Отобразит его на JDialogueBox как список с наивысшими баллами.

CJ Forrester 03.09.2024 08:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
92
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
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» — ужасное имя для класса; доступ к полям объекта является антишаблоном в ООП, лучше иметь геттеры и сеттеры!

Gyro Gearless 03.09.2024 09:22

@GyroGearless Да. Я ленив.

lhDream 03.09.2024 09:29

Лучше написать пару предложений, объясняющих ваше решение.

Lii 03.09.2024 10:05
  • Шаг 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()
);

Другие вопросы по теме