如何以均衡的方式分配学生

时间:2018-02-20 04:58:28

标签: java mysql sql

我有以下虚拟表。

+----+-------+-------+-----+--------+
| Id |Marks  |Grade  |GId  |Gender  |
+----+-------+-------+-----+--------+
| 1  | 95    | S     | 1   | 1      |
| 2  | 95    | S     | 1   | 0      |
| 3  | 93    | S     | 1   | 0      |
| 4  | 75    | B     | 3   | 1      |
| 5  | 74    | B     | 3   | 1      |
| 6  | 83    | A     | 2   | 0      |
| 7  | 83    | A     | 2   | 0      |
| 8  | 83.5  | A     | 2   | 0      |
| 9  | 70    | B     | 3   | 0      |
| 10 | 71    | B     | 3   | 1      |
| 11 | 96    | S     | 1   | 1      |
| 12 | 60    | C     | 4   | 1      |
| 13 | 65    | C     | 4   | 0      |
| 14 | 62    | C     | 4   | 0      |
| 15 | 71    | B     | 3   | 1      |
+----+-------+-------+-----+--------+

我想在一些随机的中删除它。部分。

  1. 说3段SEC A = 5,SEC B = 5,SEC C = 5学生,例如
  2. A = [SABCS],B = [SABCB],C = [SABCB] //等级

    1. 说4段SEC A = 4,SEC B = 4,SEC C = 4,SEC D = 3学生,例如
    2. A = [SABC],B = [SABC],C = [SABC],D = [SBB] //等级

      1. 说2 SECTIONS SEC A = 8,SEC B = 7名学生,例如
      2. A = [SABCSABC],B = [SABCSBB] //等级

        我跟着link得到了结果但是有很多平衡分配的限制。

        如何设置并获得所需的结果,其中分区将是动态的。

        1. MYSQL将是首选。
        2. 2.通过java / else编码也是可以接受的。

          N.B.:UPDATING谁没有得到它。

          请查看表格和相应的成绩。然后在每个部分中划分成绩(实际上是学生)。每个部分应该/必须包含每个年级的学生。这就是我为平衡分配做准备的原因。

2 个答案:

答案 0 :(得分:2)

以下方法按gradeId对数据进行排序,并同时填充每个部分

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class SectionDivider {
  public static void main(String[] args) {
    List<Student> students =
        Arrays.asList(
            new Student(1, 95f, "S", 1),
            new Student(2, 95f, "S", 1),
            new Student(3, 93f, "S", 1),
            new Student(4, 75f, "B", 3),
            new Student(5, 74f, "B", 3),
            new Student(6, 83f, "A", 2),
            new Student(7, 83f, "A", 2),
            new Student(8, 83.5f, "A", 2),
            new Student(9, 70f, "B", 3),
            new Student(10, 71f, "B", 3),
            new Student(11, 96f, "S", 1),
            new Student(12, 60f, "C", 4),
            new Student(13, 65f, "C", 4),
            new Student(14, 62f, "C", 4),
            new Student(15, 71f, "B", 3));

    int numberOfSections = 4;
    String[] divided = new String[numberOfSections];
    int divIdx = 0;

    Map<Integer, List<Student>> groupedGrades =
        students
            .stream()
            .sorted((d1, d2) -> d1.gradeId.compareTo(d2.gradeId))
            .collect(Collectors.groupingBy(d -> d.gradeId));

    while (true) {
      boolean allEmpty = true;
      for (Entry<Integer, List<Student>> entry : groupedGrades.entrySet()) {
        List<Student> value = entry.getValue();
        int size = value.size();
        for (int i = 0; i < numberOfSections && i < size; i++) {
          allEmpty = false;
          if (divided[divIdx] == null) {
            divided[divIdx] = "";
          }
          divided[divIdx] = divided[divIdx].concat(value.get(0).grade);
          divIdx = (divIdx + 1) % numberOfSections;
          value.remove(0);
          entry.setValue(value);
        }
      }
      if (allEmpty) {
        break;
      }
    }

    Arrays.stream(divided).forEach(System.out::println);
  }
}

class Student {
  Integer id;
  Float marks;
  String grade;
  Integer gradeId;

  public Student(Integer id, Float marks, String grade, Integer gradeId) {
    super();
    this.id = id;
    this.marks = marks;
    this.grade = grade;
    this.gradeId = gradeId;
  }
}

输出因示例示例而异,但会均匀分配数据。 [您可以修改numberOfSectionsstudents并试用]

答案 1 :(得分:1)

如果我理解正确,您希望在每组中尽可能均匀地添加所有年级的学生。在这种情况下,我要执行以下操作:

  1. 按年级对学生进行排序
  2. 应用the referred question中的逻辑来构建群组
  3. 按照上述问题按临时列(组)排序。
  4. 以上可以说是最简单的实现。您可能希望添加一个规则,其中每个组的成绩尽可能接近平均值,与this approach一致。

    我担心对于更复杂的算法,你需要转向像java / python这样的通用语言。