簡體   English   中英

從HashMap中的ArrayList排序值

[英]Sorting values from ArrayList inside HashMap

我很難解決我的問題。 我必須按照最高平均mark降序對students進行排序,還必須顯示所有學生的平均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

Draken是正確的,將通過的考試列表建模為學生的財產更為優雅。 但是,您可以按事物的樣子對學生進行分類。 當您想在Java中的列表上定義訂單時,可以編寫一個特殊的Comparator:

    //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);
        }
    });

我認為您不需要hashMap首先將所有學生添加到列表中。
實現一個Comparator,比較器可能會有一個方法:getExamsForStudent()
然后使用Collections.sort(list,比較器)對列表進行排序。

這是一種優雅的方法(我使用的是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()的原因是我在Student類上實現了Comparable<Student> 然后,我添加方法compareTo()並聲明如何對其進行排序。 由於您想要降序,所以我顛倒了正常的比較順序。 你可以在這里閱讀更多Comparable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM