2016-04-22 57 views
-1

我很難解決我的問題。我必須按最高平均值mark降序排列students,並顯示所有學生的平均mark。我將包括我的Main課程和來自其他課程的聲明。從ArrayList裏面排列哈希映射的值

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 

此外,我想我應該改變從IntegerDouble因爲線以上。

+0

請包括使用此代碼的示例輸入和輸出。 – ChiefTwoPencils

+0

@ChiefTwoPencils我剛剛做到了。 – brajevicm

+0

難道你不應該在學生身上有一個名爲'List passedExams;'的房產,這樣你就可以在學生和考試之間建立直接聯繫,而不是使用'int'來連接他們嗎? – Draken

回答

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()的事情是,我實現對StudentComparable<Student>的事實。然後我添加方法compareTo()並說明我希望如何排序。既然你想降序,我已經扭轉了正常的比較順序。您可以閱讀更多關於Comparablehere

0

我不認爲你需要一個哈希映射 首先添加列表中的所有學生。
實現比較器,比較器可能會有一個方法:getExamsForStudent()
然後使用Collections.sort(list,comparator)對列表進行排序。

2

德拉肯是對的,將通​​過的考試列表建模爲學生的財產更爲優雅。但是,您可以按照事情的方式對學生進行排序。 當你要定義一個列表上的順序在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); 
     } 
    });