Porównywanie liczb - komparator złożony

0

Chciałbym posortować studentów wg ocen, a jeżeli studenci mają takie same oceny to wg numeru.
Niby łatwe, no ale nie działa i nie mam pojęcia dlaczego ;p
Dobrze by było zrobić to na kolejkach priorytetowych

Przykładowo dla ciągu:
Numer Ocena
1 3
2 3
3 2
4 3
5 1
6 1
7 4
8 5
9 1
10 5

Powinienem dostać studentów (wg numeru) 5,6,9
a program wyświetla 5,9,6
...
Wskazówki, sugestie ?

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Random;


public class Problem {

	
	public static void main(String[] args) {
		
		PriorityQueue<Student>kolejka1 = new PriorityQueue<Student>(1,new MojKomparator1());
		PriorityQueue<Student>kolejka2 = new PriorityQueue<Student>(1,new MojKomparator2());
		
		Random r=new Random();
		
		for(int i=0; i<10 ; i++){
			kolejka1.add(new Student(i+1,r.nextInt(5)+1));
		}
		
		System.out.println("Kolejka1: ");
		for(Student s : kolejka1){
			System.out.println("Nr: "+s.numer+" " + "Ocena: "+s.ocena);
		}
		
		System.out.println("\n\n\n\n");
		
		while(!kolejka1.isEmpty()){
			kolejka2.add(kolejka1.poll());
		}
		
	
		System.out.println("Kolejka2: ");
		for(Student s : kolejka2){
			System.out.print("Nr: "+s.numer+" ");
		}
		

	}

}


 class Student{
	 
	 int ocena;
	 int numer;
	
	 Student(int n, int o){
		ocena=o;
		numer=n;
	 };
	
}
 
 class MojKomparator1 implements Comparator<Student>{

	public int compare(Student a, Student b) {
		return a.numer-b.numer;
	}
	 
	 
 }

 class MojKomparator2 implements Comparator<Student>{


	public int compare(Student a, Student b) {
		int tmp=a.ocena-b.ocena;
		
		return (tmp==0)?(a.numer-b.numer):tmp;
	}
	 
 }
 
0

Pierwsze co rzuciło mi się w oczy to ta linijka: int tmp=a.ocena-b.ocena;
Ja bym tak nie porównywał ,ponieważ istnieje ryzyko błędu. Co jeśli ocena była by ujemna i druga zmienna zawierała max inta dojdzie do przepełnienia i wynik będzie bzdurny. Należy taki kod pisać aby nie było ryzyka popełnienia błędu nawet jeśli nie przewidujesz ,że ocena będzie ujemna.

0
robcio napisał(a):

Ja bym tak nie porównywał .

True, podobnie w kodzie nie ma wyjątków itd a powinny być w razie gdyby coś tam się stało.
Nie chciałem "zaśmiecać" kodu, co nie zmienia faktu, że nie wiem gdzie błędu szukać :|

1

Zaglądamy do dokumentacji i widzimy, że: This class and its iterator implement all of the optional methods of the Collection and Iterator interfaces. The Iterator provided in method iterator() is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()). a konstrukcja for-each właśnie z iteratora korzysta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1