2017-02-08 4 views
2

У меня есть несколько arraylists, каждый из которых содержит данные игрока для конкретной команды. Каждый объект содержит следующие элементы в порядке; Номер Джерси, Имя, Фамилия, Предпочтительная позиция, Голы, Помощь. Пользователь решает, следует ли просматривать данные по целям или передачам, а затем данные отображаются в порядке убывания. Цели и передачи - оба типа данных int.Сортировка ArrayList объектов по конкретному элементу

Я смогу отображать данные в порядке, но то, что я застрял, - это сортировать массивList по одной из этих конкретных характеристик. Поскольку данные из всех команд находятся в разных списках arrayLists, и их нужно сортировать вместе, мне нужно объединить массивы в один мастер-массив, который будет отсортирован? Что касается сортировки, я провел немного исследований, и похоже, мне нужно использовать компаратор? Может ли кто-то помочь в этом, потому что я никогда не использовал их раньше и довольно потерял. Примеры были бы замечательными.

Я приложил несколько фрагментов кода, чтобы надеяться предоставить некоторую ясность.

ArrayList <blackTeam> blackTeam = new ArrayList <blackTeam>(); 
ArrayList <blueTeam> blueTeam = new ArrayList <blueTeam>(); 
ArrayList <greenTeam> greenTeam = new ArrayList <greenTeam>(); 
ArrayList <orangeTeam> orangeTeam = new ArrayList <orangeTeam>(); 
ArrayList <redTeam> redTeam = new ArrayList <redTeam>(); 
ArrayList <yellowTeam> yellowTeam = new ArrayList <yellowTeam>(); 

private void displaystatButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    //sort arrayList by goals/assists 

} 

EDIT: Это как мои классы настроены, а также как данные добавляются к ним. Надеюсь, это прояснит некоторые вопросы.

//add data to database 
black = new blackTeam(jerseyNum, firstName, lastName, prefPosition, goals, assists); 
blackTeam.add(black); 

class blackTeam { 
    int goals, assists; 
    String jerseyNum, firstName, lastName, prefPosition; 

    blackTeam (String _jerseyNum, String _firstName, String _lastName, String _prefPosition, int _goals, int _assists) { 
     jerseyNum = _jerseyNum; 
     firstName = _firstName; 
     lastName = _lastName; 
     prefPosition = _prefPosition; 
     goals = _goals; 
     assists = _assists; 
    } 
} 

У меня есть один класс для каждой команды.

+1

Я думаю, вы неправильно поняли роль класса. Я на 90% уверен, что вам нужен только один класс 'Team', а не' blackTeam', 'blueTeam' и т. Д. Не все ли они одинаковы друг другу? Если это так, то это будет простой случай объявления 7-го списка, добавление всего из предыдущих 6 и сортировка обычно – Stik

+0

@Stik. Да, я уверен, что вы правы, blackTeam, blueTeam и т. Д. Все одинаковы. Я не совсем уверен, что вы подразумеваете под «сортировкой». Не могли бы вы подробнее остановиться? – ckorvee

+0

Если они все одинаковые, они, я думаю, вы должны добавить свойство 'colour' в один класс, называемый' Team'. См. Мой ответ ниже для «сортировки в обычном режиме» – Stik

ответ

1

Я предлагаю использовать Comparator на вашем объекте, позвольте мне предположить, что это Team

public class Team{ 
    private int jerseyNumber; 
    private String lastName; 
    ... 
    public int getJerseyNumber(){ 
     return jerseyNumber; 
    } 
} 

Если вы хотите отсортировать в зависимости от количества джерси, генерировать JeseryNumberComaparator:

import java.util.Comparator; 

public class JeseryNumberComaparator implements Comparator { 

    @Override 
    public int compare(Team t1, Team t2) { 

     // descending order (ascending order would be: 
     // t1.getJerseyNumber()-t2.getJerseyNumber()) 
     return t1.getJerseyNumber()-t2.getJerseyNumber() 
    } 
} 

Это будет сортировать список на основе номера трикотажа:

Collections.sort(blackTeam, new JerseyNumberComparator()); 
+0

@Downvoter, пожалуйста, оставьте комментарий, затем я могу улучшить свой ответ, спасибо – haifzhan

0

Пока ваши 6 классов blackTeam до yellowTeam все сходят с одного и того же родителя, т.е. что они объявлены как это:

public class blackTeam extends Team { ... } 

, то вы можете создать новую ArrayList<Team> и добавить их все к нему:

ArrayList<Team> all = new ArrayList<>(); 
all.addAll(blackTeam); 
all.addAll(blueTeam); 
all.addAll(yellowTeam); 
// etc... 

Затем вы можете отсортировать этот список, используя экземпляр Comparator<Team>. Поскольку Java8, однако, есть гораздо аккуратнее способ создать компаратор с помощью лямбда-выражения:

all.sort((a, b) -> a.getScore() - b.getScore()); // or whatever attribute you want to compare on 

Если вы хотите сделать это по старинке вместо этого, то вы можете создать анонимный класс вроде этого:

all.sort(new Comparator<Team>() { 
    @Override 
    public int compare(Team a, Team b) { 
     return a.getScore() - b.getScore(); 
    } 
}); 

Они представляют собой одно и то же, но подход на основе лямбда является немного менее многословным!

Обратите внимание, что я подозреваю, что на самом деле вы не хотите иметь 6 разных классов для разных цветов. Вы уверены, что правильно поняли роль class?

+0

Шахты не совсем такие. Пожалуйста, см. Мое редактирование на мой оригинальный пост. Кроме того, не могли бы вы показать, как использовать компаратор ? Я никогда раньше не использовал компаратор, поэтому не знаю, как это сделать. @Stik – ckorvee

0

Для сортировки Коллекция в порядке убывания (отличная от их естественного порядка сортировки), вы должны указать свой собственный Comparator.

Для сортировки по определенному полю индивидуально (по одному), вы должны определить отдельную реализацию Comparator.

В вашем классе вы можете определить два отдельных компаратора. Вот пример кода.

static final Comparator<Team> SORT_TEAM_BY_GOALS_DESCENDING = new Comparator<Team>(){ 
    public int compare(Team t1, Team t2){ 
      return t2.getGoals() - t1.getGoals(); 
    } 
} 

static final Comparator<Team> SORT_TEAM_BY_ASSIST_DESCENDING = new Comparator<Team>(){ 
    public int compare(Team t1, Team t2){ 
      return t2.getAssist() - t1.getAssist(); 
    } 
} 

Убедитесь, что нормальный вид это всегда естественный порядок, в вашем случае для int это всегда Восходящий. Чтобы иметь порядок по убыванию, вам нужно сделать t2 - t1. t1 - t2 даст вам естественный Восходящий порядок.

Теперь, чтобы использовать этот Comparator, используйте следующий код.

Collections.sort(team, SORT_TEAM_BY_GOALS_DESCENDING); 

или

Collections.sort(team, SORT_TEAM_BY_ASSIST_DESCENDING); 

и, конечно, если все эти разные цвета List (т.е. BlackTeam и так далее) только для конкретной команды, идентифицированной цветом, чем добавить еще одно поле для вашего Team класса называемый «цвет», который идентифицирует каждого игрока вместе с тем, к какой команде они принадлежат.

Смежные вопросы