我最近参加了一次面试,他们问了我一个小问题,问题如下
有学生名单
List<Student> students;
Class Student{
String rollNo;
Map<String, Integer> marks ;
}Stdunt.marks实际上是主语和标记的组合
应该写一个方法,它应该根据主题返回前10名学生数组。
List<Student> getTop10(String subjectName){
}发布于 2017-06-08 19:37:33
我给出的答案是:
private static void PrintTop5(ArrayList<Student> list,String subject){
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student st1, Student st2) {
// TODO Auto-generated method stub
return st2.getSubjectMark(subject) - st1.getSubjectMark(subject);
}
});
ArrayList<Student> studentList = new ArrayList<Student>(list.subList(0,5));
for(Student student : studentList){
System.out.println(student.getRollNum() + " MARK : "+student.getSubjectMark(subject));
}
}学生类如下所示
package com.main;
import java.util.HashMap;
public class Student {
private String rollNo;
private HashMap<String, Integer> marks ;
public Student(){
marks = new HashMap<>();
}
public void setRollNumber(String number){
this.rollNo = number;
}
public void setSubjectAndMark(String subName,int mark){
this.marks.put(subName, mark);
}
public HashMap<String, Integer> getAllMarks(){
return marks;
}
public int getSubjectMark(String subject){
return marks.get(subject);
}
public String getRollNum(){
return rollNo;
}
}发布于 2017-06-08 20:08:57
总的来说,你的想法是正确的,对整个列表进行排序,并选择前N名的学生,实际上用java 8看起来会更干净。
private static void PrintTop5(ArrayList<Student> list,String subject){
list.sort(Comparator
.comparing((Student student) -> student.getSubjectMark(subject))
.reversed());
List<Student> studentList = list.stream().limit(5).collect(Collectors.toList());
for(Student student : studentList){
System.out.println(student.getRollNum() + " MARK : "+student.getSubjectMark(subject));
}
}https://stackoverflow.com/questions/44434665
复制相似问题