Java 如何根据arraylist中每个对象的属性将自定义对象的arraylist划分为x组?

Java 如何根据arraylist中每个对象的属性将自定义对象的arraylist划分为x组?,java,arraylist,Java,Arraylist,我一直在努力想办法解决这个问题,但我仍在挠头。我需要将一个数组列表中的对象(在本例中是人)从总共12-25人分成6个相等的组。他们需要分成6人一组,两个半场都按照每个人物对象的攻击状态和防御状态的最佳状态进行排序。我已经编写了基于每个统计数据的最佳值对arraylist进行排序的算法,但我不确定如何实现一种方法来显示六个组中没有重复名称的组 我得到指示: 您的程序需要能够将名册划分为尽可能多的团队。例如,一个有18名球员的名册将分成三个不同的混战队,每个队有6名球员。花名册文件将始终包含12至2

我一直在努力想办法解决这个问题,但我仍在挠头。我需要将一个数组列表中的对象(在本例中是人)从总共12-25人分成6个相等的组。他们需要分成6人一组,两个半场都按照每个人物对象的攻击状态和防御状态的最佳状态进行排序。我已经编写了基于每个统计数据的最佳值对arraylist进行排序的算法,但我不确定如何实现一种方法来显示六个组中没有重复名称的组

我得到指示:

您的程序需要能够将名册划分为尽可能多的团队。例如,一个有18名球员的名册将分成三个不同的混战队,每个队有6名球员。花名册文件将始终包含12至25名球员的名单,而混战队始终有6名球员

教练希望两支球队保持合理的平衡。要做到这一点,你的程序应该通过将最好的攻击者分配给每个不同的团队,从而使每个混战团队占一半。例如,一个有12名球员的名单将被分为2个混战队,前6名进攻球员中的3名将被分配到两个混战队中的每一个。在顶级进攻球员被分配到每个混战队的一半后,顶级拦网球员(来自剩余的未分配球员)将同样被分配到每个混战队的另一半(本例中每个混战队有三名)

以下是我目前在花名册课程中的一些内容:

    void sortbyAttack() {
    peopleArrayList.sort(Comparator.comparing(Person::getAttackStat).reversed());
}

void sortbyDefense() {
    peopleArrayList.sort(Comparator.comparing(Person::getDefenseStat).reversed());
}

void makeTeams() {
    ArrayList<String> team1 = new ArrayList<>();
    ArrayList<String> team2 = new ArrayList<>();
    ArrayList<String> team3 = new ArrayList<>();
    ArrayList<String> team4 = new ArrayList<>();

    sortbyAttack();
    for (int i = 0; i < 6; i++) {
        team1.add(peopleArrayList.get(i).toString());
    }
    for (int i = 6; i < 12; i++) {
        team2.add(peopleArrayList.get(i).toString());
    }
    for (int i = 0; i < 3; i++) {
        team3.add(team1.get(i).toString());
        team3.add(team2.get(i).toString());
    }
    for (int i = 3; i < 6; i++) {
        team4.add(team1.get(i).toString());
        team4.add(team2.get(i).toString());
    }
    System.out.println(team1 + "\n" + team2);
    System.out.println(team3 + "\n" + team4);
  }
}
void sortbyAttack(){
排序(Comparator.comparing(Person::getAttackStat.reversed());
}
void sortbyDefense(){
排序(Comparator.comparing(Person::getDefenseStat.reversed());
}
void makeTeams(){
ArrayList team1=新的ArrayList();
ArrayList team2=新的ArrayList();
ArrayList team3=新的ArrayList();
ArrayList team4=新的ArrayList();
sortbyAttack();
对于(int i=0;i<6;i++){
team1.add(peopleArrayList.get(i.toString());
}
对于(int i=6;i<12;i++){
team2.add(peopleArrayList.get(i.toString());
}
对于(int i=0;i<3;i++){
team3.add(team1.get(i.toString());
team3.add(team2.get(i.toString());
}
对于(int i=3;i<6;i++){
team4.add(team1.get(i.toString());
team4.add(team2.get(i.toString());
}
System.out.println(team1+“\n”+team2);
System.out.println(team3+“\n”+team4);
}
}

我试着想弄清楚,我浏览了这个网站,搜索了大约一百次,但是我似乎找不到一个合适的方法来实现按本地值将我的自定义对象按最大数量的6组进行分类和划分和分发,在同一个混战队伍中没有任何重复的人。

首先,循环的条件迫使队伍有一个特定的长度,在这个例子中是36,因为我想你不希望队伍中有重复的球员。我很确定你的教授想要一个能为n个玩家工作的解决方案

这就是说,我认为你必须围绕着
/
操作员,整个部门工作。假设您指示n=31
n/6
将给出
5
的结果。然后你得到了你拥有的团队数量,因此你的方法
createTeams
必须有一个5次迭代的循环,在这里你创建一个新的
ArrayList
。我建议使用另一个动态结构来保存每个团队,比如另一个
ArrayList

一旦你创建了你的“团队”,你就可以对你的球员进行正确的排序,然后将他们添加到不同的团队中。在这里我们可以找到复制的问题。确保不要添加两次相同的玩家:a)将洞列表保存在辅助结构上,一旦你选择了它们,你就会删除它们b)小心地使用相同的指针指向代表公鸡的初始结构

我想你有这个想法,你使用的方法是正确的,但是你必须在算法上下功夫。 祝你好运,还有什么问题可以问