Chiarimento su comportamento "strano" di un Comparator

di il
3 risposte

Chiarimento su comportamento "strano" di un Comparator

Ciao ragazzi, qualcuno potrebbe chiarirmi un dubbio:
in un programma che sto facendo ho una lista di chiavi e valori, vorrei ordinare la lista facendo
Collections.sort(miaLista, mioComparatore);
A questo punto vado a creare mioComparatore in questo modo:
Comparator<Map.Entry<String, Integer>> comp=new Comparator<Map.Entry<String,Integer>>() {
			
			public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) {
				
				
				if(arg0.getValue()>arg1.getValue()) return 1;
				if(arg0.getValue()<arg1.getValue()) return -1;
				int cmp=arg0.getKey().compareTo(arg1.getKey());
				return cmp;
				
				
			}
		};
La mia domanda è: perchè se eseguo il codice con questo comparatore, nel dettaglio con questi return +1/-1, mi da esattamente l'ordine inverso?
Mentre se inverto il return +1 con il -1 funziona?
Andandomi a leggere la documentazione del metodo public int compare(arg0, arg1) dice che il metodo restituisce un intero maggiore di zero se arg0>arg1 ecc ecc...e allora non capisco perchè faccia esattamente l'opposto.
Grazie a tutti in anticipo per l'aiuto.

3 Risposte

  • Re: Chiarimento su comportamento "strano" di un Comparator

    riccac ha scritto:


    allora non capisco perchè faccia esattamente l'opposto.
    Ad "occhio" a me pare corretto. Nel senso che compara prima il value (Integer) in senso ascendente e a parità di value, compara poi il key (String) in senso ascendente.

    Puoi mostrare l'output (un print .. quello che puoi) della lista ordinata con quel comparator??
  • Re: Chiarimento su comportamento "strano" di un Comparator

    Per esempio se la lista originale fosse:
    [ ["ciao", 1] , ["come", 2] , ["stai", 3] , ["bene", 2] ] io mi aspetto che il codice mi dia in output:

    stai 3 - bene 2 - come 2 - ciao 1 mentre invece mi da ciao 1 - bene 2 - come 2 -stai 3
  • Re: Chiarimento su comportamento "strano" di un Comparator

    riccac ha scritto:


    Per esempio se la lista originale fosse:
    [ ["ciao", 1] , ["come", 2] , ["stai", 3] , ["bene", 2] ] io mi aspetto che il codice mi dia in output:

    stai 3 - bene 2 - come 2 - ciao 1 mentre invece mi da ciao 1 - bene 2 - come 2 -stai 3
    Ma come hai fatto tu infatti l'ordinamento è ascendente, 1 2 2 3
    (per chiarire: se arg0.value è 1 e arg1.value è 2 tu ora restituisci -1 perché appunto arg0.value < arg1.value)

    Se lo vuoi discendente, devi appunto "girare" i +1/-1
Devi accedere o registrarti per scrivere nel forum
3 risposte