2015-11-10 28 views
0

的设置如下:我有一组课堂的对象{MATH | SCIENCE | ENGLISH}。我也有一个地图Period作为关键和一组studentIds作为价值。这是从getPeriodStudentMappingForClassroom()方法返回的。现在,作为输入,给出字符串"MATH, ENGLISH, SCIENCE",其指示返回的顺序studentIds(选项的数量是固定的)。我还有另一个字符串,其中包含任意数量的句点,例如"B, A"(可以有任意数量的句点)。下面是一个简单的可视化:排序由两个标准用于最终结果

Classroom MATH: 
Period A -> Set<Integer> studentIds 
Period B -> Set<Integer> studentIds 

Classroom ENGLISH: 
Period A -> Set<Integer> studentIds 
Period B -> Set<Integer> studentIds 

作为输出,我想studentIds返回的教室和时间以这样的方式,首先我得到的所有studentIdsPeriod B排序。这些studentIdsPeriod B按教室顺序"MATH, ENGLISH, SCIENCE"排序。然后我得到studentIdsPeriod A按教室顺序"MATH, ENGLISH, SCIENCE"排序。因此,对于前:

Input: 
String classroomOrder = "MATH, ENGLISH, SCIENCE" 
String periodOrder = "B, A" 
public Map<String, <Set<Integer>> getPeriodStudentMappingForClassroom(String classroom) 

Output: 
Set<Integer> studentIds 
Ex. 
Period A studentIds in Math classroom 
Period A studentIds in English classroom 
Period A studentIds in Science classroom 
Period B studentIds in Math classroom ... 

我当然可以创建任何辅助方法和结构包含的信息,但我不能改变getPeriodStudentMappingForClassroom()方法,必须使用它。任何人都可以请指导我如何构建这个玩具问题的解决方案?

+2

什么你到底解决了这个问题吗?现在这个问题看起来像是一个需求清单,而不是一个重点突出的具体问题。 –

+1

这是一个仿照个人项目更复杂的玩具问题。 –

+1

如果你发布了你的代码(可编译的小例子),并且描述了你正在获得的东西以及你将得到什么,那么帮助你会容易得多。 –

回答

1

我认为它是一个有趣的问题。不知道为什么它还没有被回答。假设你有一个类ClassRoom它封装时期,当然名字和学生证如下

public static class ClassRoom { 
    private String period; // A or B 
    private String courseName; // MATH, SCIENCE or ENGLISH 
    private Set<Integer> studentIds; 

    public ClassRoom(String period, String courseName, Integer... studentIds) { 
     this.period = period; 
     this.courseName = courseName; 
     this.studentIds = new HashSet<>(Arrays.asList(studentIds)); 
    } 

    public String getPeriod() { 
     return period; 
    } 

    public String getCourseName() { 
     return courseName; 
    } 

    public Set<Integer> getStudentIds() { 
     return studentIds; 
    } 

    @Override 
    public String toString() { 
     return "Period='" + period + '\'' + 
       ", CourseName='" + courseName + '\'' + 
       ", studentIds=" + studentIds; 
    } 
} 

然后如下类别排序列表可以打印

List<String> order = Arrays.asList("MATH", "ENGLISH", "SCIENCE"); 

    classes.stream().sorted(
      comparing(ClassRoom::getPeriod) 
        .thenComparingInt(c -> order.indexOf(c.getCourseName()))) 
      .forEach(System.out::println); 

输出

Period='A', CourseName='MATH', studentIds=[3, 4, 89, 90, 78] 
Period='A', CourseName='MATH', studentIds=[34, 3, 4, 5, 6] 
Period='A', CourseName='MATH', studentIds=[2, 3, 4, 5, 232] 
Period='A', CourseName='SCIENCE', studentIds=[1, 2, 3, 4, 57] 
Period='A', CourseName='SCIENCE', studentIds=[34, 2, 3, 5] 
Period='B', CourseName='ENGLISH', studentIds=[2, 5, 7] 
Period='B', CourseName='ENGLISH', studentIds=[1, 2, 34, 3, 12]