按特定元素排序对象的ArrayList

时间:2017-02-08 19:09:07

标签: java sorting object arraylist element

我有几个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;
    }
}

每个团队都有一个这样的课程。

3 个答案:

答案 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个班级blackTeamyellowTeam都来自同一个家长,即。它们被声明为:

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 - t1t1 - t2将为您提供自然的升序。

现在,为了使用此Comparator,只需使用以下代码。

Collections.sort(team, SORT_TEAM_BY_GOALS_DESCENDING);

Collections.sort(team, SORT_TEAM_BY_ASSIST_DESCENDING);

当然,如果所有这些不同的颜色List(即blackTeam等)仅适用于通过颜色标识的特定团队,则为您的Team类添加一个名为“颜色”的字段。这将识别每个玩家以及他们属于哪个团队。