2016-04-22 3 views
-1

Мне сложно решить мою проблему. Мне нужно сортировать students в порядке убывания наивысшего среднего mark, а также показывать среднее число учащихся в mark. Я включу класс Main и объявления из других классов.Сортировка значений из ArrayList внутри HashMap

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

EDIT: Добавление ввод и вывод

Что видно по умолчанию:

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 из строки выше.

+0

Пожалуйста, введите пример ввода и вывода с использованием этого кода. – ChiefTwoPencils

+0

@ChiefTwoPencils Я просто сделал. – brajevicm

+0

Если у вас нет объекта на вашем ученике, который называется «List passExams;', чтобы у вас была прямая связь между студентом и экзаменами, а не с помощью «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 + 
       '}'; 
    } 

} 

Student

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() и указываю, как я хочу его сортировать. Поскольку вы хотели по убыванию, я изменил обычный порядок сравнения. Вы можете прочитать больше на Comparablehere

0

Я не думаю, что вам нужна hashMap Сначала добавьте всех учеников в список.
Внесите компаратор, у компаратора, вероятно, будет метод: getExamsForStudent()
Затем отсортируйте список, используя Collections.sort (list, comparator).

2

Draken is right, более элегантно моделировать пройденный список экзаменов как свойство учащегося. Тем не менее, вы можете сортировать своих учеников так, как есть. Если вы хотите, чтобы определить порядок на список в 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); 
     } 
    }); 
Смежные вопросы