从HashMap中的ArrayList排序值

时间:2016-04-22 07:35:28

标签: java sorting arraylist hashmap

我很难解决问题。我必须按最高平均students降序排序mark,并显示所有学生的平均mark。我将包括我的Main课程和其他课程的声明。

public Main()
{
    ArrayList<Student> students = new ArrayList<Student>();
    Student A = new Student("John", "Doe", 1000);
    students.add(A);
    Student B = new Student("Michael", "Hawk", 2000);
    students.add(B);
    Student C = new Student("Nicholas", "Johnson", 3000);
    students.add(C);

    HashMap<Integer, ArrayList<PassedExams>> map = new HashMap<Integer, ArrayList<PassedExams>>();

    for (Student student : students)
    {
        map.put(student.getIndeks(), new ArrayList<PassedExams>());
    }

    for (Entry<Integer,ArrayList<PassedExams>> exam : map.entrySet())
    {
        if (exam.getKey() == 1000)
        {
            ArrayList<PassedExams> passedExam = exam.getValue();
            passedExam.add(new PassedExams("CS102", 6));
            passedExam.add(new PassedExams("CS220", 8));
            exam.setValue(passedExam);
        }
        if (exam.getKey() == 2000)
        {
            ArrayList<PassedExams> passedExam = exam.getValue();
            passedExam.add(new PassedExams("MA101", 10));
            passedExam.add(new PassedExams("CS101", 7));
            exam.setValue(passedExam);
        }
        if (exam.getKey() == 3000)
        {
            ArrayList<PassedExams> passedExam = exam.getValue();
            passedExam.add(new PassedExams("CS115", 9));
            passedExam.add(new PassedExams("MA102", 7));
            exam.setValue(passedExam);
        }
    }

    for (Student student : students)
    {
        System.out.println(student.toString() + " " + map.get(student.getIndex()));
    }
}

`

public class PassedExams
{
    private String code;
    private Integer mark;
    // get and set methods
    // aswell as toString();
}

`

public class Student
{
    private String name, surname;
    private Integer index;
    // get and set methods
    // aswell as toString();
}

编辑:添加输入和输出

默认情况下看到的内容:

Student Name: John Surname: Doe Index: 1000 [Predmet:  Code: CS102 Mark: 6, Predmet:  Code: CS220 Mark: 8]
Student Name: Michael Surname: Hawk Index: 2000 [Predmet:  Code: MA101 Mark: 10, Predmet:  Code: CS101 Mark: 7]
Student Name: Nicholas Surname: Johnson Index: 3000 [Predmet:  Code: CS115 Mark: 9, Predmet:  Code: MA102 Mark: 7]

排序后应该看到什么:

Student Name: Michael Surname: Hawk Index: 2000 [Predmet:  Code: MA101 Mark: 10, Predmet:  Code: CS101 Mark: 7]
Student Name: Nicholas Surname: Johnson Index: 3000 [Predmet:  Code: CS115 Mark: 9, Predmet:  Code: MA102 Mark: 7]
Student Name: John Surname: Doe Index: 1000 [Predmet:  Code: CS102 Mark: 6, Predmet:  Code: CS220 Mark: 8]

总平均mark

Total average mark from students is: 7.83

另外我想我应该从Integer更改为Double,因为上面一行。

3 个答案:

答案 0 :(得分:2)

Draken是对的,将通​​过的考试列表建模为学生的财产更为优雅。但是,您可以按照事物的方式对学生进行排序。 如果要在Java列表中定义订单,可以编写一个特殊的比较器:

    //sorting starts here
    Collections.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            double sum1 = 0, sum2 = 0;

            for (PassedExams pe : map.get(o1.getIndex())) sum1+=pe.mark;
            for (PassedExams pe : map.get(o2.getIndex())) sum2+=pe.mark;

            sum1 /= map.get(o1.getIndex()).size();
            sum2 /= map.get(o2.getIndex()).size();

            return Double.compare(sum2, sum1);
        }
    });

答案 1 :(得分:0)

我认为你不需要哈希地图 首先将所有学生添加到列表中 实现比较器,比较器可能有一个方法:getExamsForStudent()
然后使用Collections.sort(列表,比较器)对列表进行排序。

答案 2 :(得分:0)

这是实现它的优雅方式(我使用的是Java 1.7,所以请忽略缺少谓词!)

主要

public class App {

    public static void main(String[] args) {
        new App();
    }
    public App()
    {
        ArrayList<Student> students = new ArrayList<Student>();
        Student A = new Student("John", "Doe", 1000);
        students.add(A);
        Student B = new Student("Michael", "Hawk", 2000);
        students.add(B);
        Student C = new Student("Nicholas", "Johnson", 3000);
        students.add(C);

        for (Student student : students)
        {
            if (student.getIndex() == 1000)
            {
                student.getPassedExamList().add(new PassedExam("CS102", 6));
                student.getPassedExamList().add(new PassedExam("CS220", 8));
            }
            if (student.getIndex() == 2000)
            {
                student.getPassedExamList().add(new PassedExam("MA101", 10));
                student.getPassedExamList().add(new PassedExam("CS101", 7));
            }
            if (student.getIndex() == 3000)
            {
                student.getPassedExamList().add(new PassedExam("CS115", 9));
                student.getPassedExamList().add(new PassedExam("MA102", 7));
            }
        }
        for (Student student : students)
        {
            System.out.println(student.toString() + " " + student.getPassedExamList());
        }
        Collections.sort(students);
        System.out.println("\nSorted\n");
        for (Student student : students)
        {
            System.out.println(student.toString() + " " + student.getPassedExamList());
        }

        System.out.println("\nCalculating average\n");
        double total = 0;
        double count = 0;
        for (Student student : students)
        {
            count += student.getPassedExamList().size();
            total += student.getTotalMarks();
        }
        DecimalFormat df = new DecimalFormat("0.##");
        System.out.println("Average is " + df.format(total / count));
    }
}

通过考试

public class PassedExam {
    private String code;
    private Integer mark;

    public PassedExam(String code, int mark){
        this.code = code;
        this.mark = mark;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public Integer getMark() {
        return mark;
    }

    public void setMark(Integer mark) {
        this.mark = mark;
    }

    @Override
    public String toString() {
        return "PassedExams{" +
                "code='" + code + '\'' +
                ", mark=" + mark +
                '}';
    }

}

<强>学生

public class Student implements Comparator<Student>, Comparable<Student> {
    private String name, surname;
    private Integer index;
    private List<PassedExam> passedExamList = new ArrayList<PassedExam>();

    public Student(String name, String surname, int index){
        this.name = name;
        this.surname = surname;
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public Integer getIndex() {
        return index;
    }

    public void setIndex(Integer index) {
        this.index = index;
    }

    public List<PassedExam> getPassedExamList() {
        return passedExamList;
    }

    public int getTotalMarks(){
        int total = 0;
        for(PassedExam exam : passedExamList)
            total += exam.getMark();
        return total;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                '}';
    }

    @Override
    public int compare(Student o1, Student o2) {
        return Integer.compare(o2.getTotalMarks(), o1.getTotalMarks());
    }

    @Override
    public int compareTo(Student o) {
        return Integer.compare(o.getTotalMarks(), this.getTotalMarks());
    }
}

允许我调用Collections.sort()的事实是我在Comparable<Student>类上实现Student。然后我添加方法compareTo()并说明我希望它如何排序。由于你想要降序,我已经颠倒了正常的比较顺序。您可以在Comparable here

上阅读更多内容