我有几个arraylists,每个arraylists包含特定团队的玩家数据。每个对象按顺序包含以下元素;泽西号码,名字,姓氏,首选位置,目标,助攻。用户决定是按目标还是辅助查看数据,然后按降序显示数据。目标和助攻都是int数据类型。
我将能够很好地显示数据,但我坚持的是如何通过这些特定统计数据之一对arrayList进行排序。因为来自所有团队的数据都在不同的数组列表中,并且需要一起排序,我是否需要将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
}
编辑: 这就是我的类的设置方式,以及如何将数据添加到它们中。希望这能解决一些问题。
//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;
}
}
每个团队都有一个这样的课程。
答案 0 :(得分: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());
答案 1 :(得分: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开始,有一种更简洁的方法可以使用lambda表达式创建比较器:
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();
}
});
它们相同,但基于lambda的方法不那么冗长!
请注意,我怀疑你实际上并不想为不同颜色设置6个不同的类。您确定已正确理解class
的角色吗?
答案 2 :(得分: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
类添加一个名为“颜色”的字段。这将识别每个玩家以及他们属于哪个团队。