【问题标题】:Sorting values from ArrayList inside HashMap在 HashMap 中对 ArrayList 中的值进行排序
【发布时间】:2016-08-15 17:23:20
【问题描述】:

我很难解决我的问题。我必须按最高平均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 因为上面的行。

【问题讨论】:

  • 请包含使用此代码的示例输入和输出。
  • @ChiefTwoPencils 我刚刚做了。
  • 您是否应该在 Student 上拥有一个名为 List&lt;PassedExams&gt; passedExams; 的属性,以便在学生和考试之间建立直接链接,而不是使用 int 来链接它们?
  • 下次贴代码时请不要省略代码中使用的构造函数/方法

标签: java sorting arraylist hashmap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一种优雅的方法(我使用的是 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&lt;Student&gt;。然后我添加方法compareTo() 并说明我希望它如何排序。既然你想要降序,我已经颠倒了正常的比较顺序。你可以阅读更多关于Comparablehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多