需求分析
**业务需求 : 二年级一班级有 50人 ,分为10个小组.
分组规则:
1 各个组的男女比例要大致平衡
2 各组成员的身高和要大致相等 例如 1组 身高和 = 2 组身高和 = 3 组. 以此类推
3 各组成员的总分和要大致相等 例如 1组 身高和 = 2 组身高和 = 3 组. 以此类推
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class DataGrouper {
public static List<List<Person>> groupPeople(List<Person> people, int numGroups, int peoplePerGroup) {
List<List<Person>> groups = new ArrayList<>();
for (int i = 0; i < numGroups; i++) {
groups.add(new ArrayList<>());
}
// Sort people by gender and then some other criteria if needed
Collections.sort(people, Comparator.comparing(Person::getGender));
// Simple greedy approach
for (Person person : people) {
int bestGroup = -1;
int minDiff = Integer.MAX_VALUE;
// Find the group with the smallest difference in total height
for (int i = 0; i < numGroups; i++) {
int currentTotalHeight = groups.get(i).stream()
.mapToInt(Person::getHeight)
.sum();
int diff = Math.abs(targetHeightPerGroup - currentTotalHeight);
if (diff < minDiff && groups.get(i).size() < peoplePerGroup) {
minDiff = diff;
bestGroup = i;
}
}
if (bestGroup != -1) {
groups.get(bestGroup).add(person);
}
}
// Note: This implementation does not guarantee perfect balance in height or score,
// but tries to keep groups roughly balanced in size and gender.
// For exact balancing, a more complex algorithm (e.g., dynamic programming, backtracking) would be needed.
return groups;
}
// This is a placeholder for the target height per group, which should be calculated based on total height and number of groups
private static int targetHeightPerGroup = 0; // You would need to calculate this based on total height and number of groups
public static void main(String[] args) {
// Example usage
List<Person> people = new ArrayList<>();
people.add(new Person("吴思彤", "F", 160, 374.5));
people.add(new Person("方新苗", "F", 159, 388.0));
people.add(new Person("冯洛伊", "F", 149, 373.0));
people.add(new Person("吴雨伦", "M", 164, 368.5));
people.add(new Person("李佳如", "F", 169, 368.5));
people.add(new Person("李浩泽", "M", 155, 364.0));
people.add(new Person("周政宏", "M", 187, 364.0));
people.add(new Person("骆思媛", "F", 156, 362.0));
people.add(new Person("陶洁", "F", 172, 360.0));
people.add(new Person("陈炅", "M", 142, 357.0));
people.add(new Person("宋浩文", "M", 150, 356.0));
people.add(new Person("郭凯鸣", "M", 164, 353.0));
people.add(new Person("江诗莹", "F", 150, 352.5));
people.add(new Person("陈子轩", "M", 156, 349.0));
people.add(new Person("唐梓航", "M", 159, 347.5));
people.add(new Person("董凌希", "F", 149, 346.5));
people.add(new Person("黄紫依", "F", 164, 346.5));
people.add(new Person("程涵薇", "F", 164, 343.0));
people.add(new Person("王国林", "M", 170, 340.5));
people.add(new Person("罗晨又", "M", 162, 335.5));
people.add(new Person("林依辰", "F", 150, 332.5));
people.add(new Person("顾恩赫", "M", 150, 330.0));
people.add(new Person("华子雨", "F", 142, 327.5));
people.add(new Person("吴若云", "F", 164, 326.5));
people.add(new Person("林夏", "F", 149, 326.0));
people.add(new Person("袁代隆", "M", 143, 318.5));
people.add(new Person("王玉鑫", "M", 155, 318.0));
people.add(new Person("郑书扬", "M", 165, 312.5));
people.add(new Person("黄帮伟", "M", 142, 312.5));
people.add(new Person("薛颂业", "M", 150, 308.5));
people.add(new Person("杨凯迪", "M", 151, 306.0));
people.add(new Person("杨景皓", "M", 175, 303.5));
people.add(new Person("牛恺文", "M", 151, 302.5));
people.add(new Person("吴子轩", "M", 156, 298.5));
people.add(new Person("吴俊熙", "M", 160, 288.5));
people.add(new Person("陈睿", "M", 170, 271.5));
people.add(new Person("钱辰佑", "M", 158, 271.5));
people.add(new Person("黄蔚哲", "M", 160, 262.5));
people.add(new Person("靳梓轩", "F", 168, 260.5));
people.add(new Person("唐瑶", "F", 168, 247.5));
people.add(new Person("孙亚煊", "F", 164, 244.5));
people.add(new Person("陈可馨", "F", 154, 208.0));
people.add(new Person("卢婧雯", "F", 154, 203.0));
people.add(new Person("宋鑫", "M", 155, 163.5));
people.add(new Person("盛诗祺", "F", 150, 161.5));
people.add(new Person("杨珂", "F", 162, 91.0));
// Add people to the list...
// 分8组
int numGroups = 8;
// 每组6人
int peoplePerGroup = 6;
// Calculate target height per group based on total height and number of groups (not shown here)
List<List<Person>> groups = groupPeople(people, numGroups, peoplePerGroup);
int count = 0;
// Print or process the groups...
for (int i = 0; i < groups.size(); i++) {
System.out.print("Group " + (i + 1) + ": ");
System.out.print(" 身高和" + groups.get(i).stream().mapToInt(Person::getHeight).sum());
System.out.print(" 总分和" + groups.get(i).stream().mapToDouble(Person::getTotalScore).sum());
int M = groups.get(i).stream()
.filter(stu -> "M".equals(stu.getGender()))
.collect(Collectors.toList()).size();
int F = groups.get(i).stream()
.filter(stu -> "F".equals(stu.getGender()))
.collect(Collectors.toList()).size();
System.out.println(" 男: " + M + " 女: " + F);
for (int j = 0; j < groups.get(i).size(); j++) {
count = count + 1;
System.out.println(groups.get(i).get(j) + " - " + j);
}
System.out.println(count);
}
}
}
class Person {
String name;
String gender;
int height;
double totalScore;
public Person(String name, String gender, int height, double totalScore) {
this.name = name;
this.gender = gender;
this.height = height;
this.totalScore = totalScore;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public double getTotalScore() {
return totalScore;
}
public void setTotalScore(double totalScore) {
this.totalScore = totalScore;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", height=" + height +
", totalScore=" + totalScore +
'}';
}
}
输出结果, 由于数据量比较小,看起来不够平衡, 数据量越大会越平衡
Group 1: 身高和939 总分和1840.5 男: 3 女: 3
Person{name='吴思彤', gender='F', height=160, totalScore=374.5} - 0
Person{name='林夏', gender='F', height=149, totalScore=326.0} - 1
Person{name='卢婧雯', gender='F', height=154, totalScore=203.0} - 2
Person{name='郭凯鸣', gender='M', height=164, totalScore=353.0} - 3
Person{name='黄帮伟', gender='M', height=142, totalScore=312.5} - 4
Person{name='陈睿', gender='M', height=170, totalScore=271.5} - 5
6
Group 2: 身高和832 总分和1727.0 男: 3 女: 2
Person{name='方新苗', gender='F', height=159, totalScore=388.0} - 0
Person{name='吴若云', gender='F', height=164, totalScore=326.5} - 1
Person{name='吴雨伦', gender='M', height=164, totalScore=368.5} - 2
Person{name='王国林', gender='M', height=170, totalScore=340.5} - 3
Person{name='杨景皓', gender='M', height=175, totalScore=303.5} - 4
11
Group 3: 身高和942 总分和1814.0 男: 3 女: 3
Person{name='冯洛伊', gender='F', height=149, totalScore=373.0} - 0
Person{name='黄紫依', gender='F', height=164, totalScore=346.5} - 1
Person{name='盛诗祺', gender='F', height=150, totalScore=161.5} - 2
Person{name='陈子轩', gender='M', height=156, totalScore=349.0} - 3
Person{name='郑书扬', gender='M', height=165, totalScore=312.5} - 4
Person{name='钱辰佑', gender='M', height=158, totalScore=271.5} - 5
17
Group 4: 身高和960 总分和1798.0 男: 4 女: 2
Person{name='李佳如', gender='F', height=169, totalScore=368.5} - 0
Person{name='靳梓轩', gender='F', height=168, totalScore=260.5} - 1
Person{name='李浩泽', gender='M', height=155, totalScore=364.0} - 2
Person{name='罗晨又', gender='M', height=162, totalScore=335.5} - 3
Person{name='杨凯迪', gender='M', height=151, totalScore=306.0} - 4
Person{name='宋鑫', gender='M', height=155, totalScore=163.5} - 5
23
Group 5: 身高和927 总分和1896.5 男: 3 女: 3
Person{name='骆思媛', gender='F', height=156, totalScore=362.0} - 0
Person{name='华子雨', gender='F', height=142, totalScore=327.5} - 1
Person{name='孙亚煊', gender='F', height=164, totalScore=244.5} - 2
Person{name='宋浩文', gender='M', height=150, totalScore=356.0} - 3
Person{name='王玉鑫', gender='M', height=155, totalScore=318.0} - 4
Person{name='吴俊熙', gender='M', height=160, totalScore=288.5} - 5
29
Group 6: 身高和828 总分和1604.0 男: 3 女: 2
Person{name='陶洁', gender='F', height=172, totalScore=360.0} - 0
Person{name='唐瑶', gender='F', height=168, totalScore=247.5} - 1
Person{name='周政宏', gender='M', height=187, totalScore=364.0} - 2
Person{name='顾恩赫', gender='M', height=150, totalScore=330.0} - 3
Person{name='牛恺文', gender='M', height=151, totalScore=302.5} - 4
34
Group 7: 身高和895 总分和1867.0 男: 3 女: 3
Person{name='江诗莹', gender='F', height=150, totalScore=352.5} - 0
Person{name='林依辰', gender='F', height=150, totalScore=332.5} - 1
Person{name='陈可馨', gender='F', height=154, totalScore=208.0} - 2
Person{name='陈炅', gender='M', height=142, totalScore=357.0} - 3
Person{name='袁代隆', gender='M', height=143, totalScore=318.5} - 4
Person{name='吴子轩', gender='M', height=156, totalScore=298.5} - 5
40
Group 8: 身高和944 总分和1699.0 男: 3 女: 3
Person{name='董凌希', gender='F', height=149, totalScore=346.5} - 0
Person{name='程涵薇', gender='F', height=164, totalScore=343.0} - 1
Person{name='杨珂', gender='F', height=162, totalScore=91.0} - 2
Person{name='唐梓航', gender='M', height=159, totalScore=347.5} - 3
Person{name='薛颂业', gender='M', height=150, totalScore=308.5} - 4
Person{name='黄蔚哲', gender='M', height=160, totalScore=262.5} - 5
46