Lista ordinamento

di il
10 risposte

Lista ordinamento

Buongiorno a tutti! Avrei bisogno di un aiuto: non riesco a ordinare un lista di integer. L’ordinemento devo farlo partendo dal valore 1 e così via lasciando il valore 0 all’ultimo posto. Leggendo in giro potrei farlo con comparator ma non ho capito granché sinceramente...

10 Risposte

  • Re: Lista ordinamento

    trap88 ha scritto:


    L’ordinemento devo farlo partendo dal valore 1 e così via lasciando il valore 0 all’ultimo posto.
    Quindi un ordinamento molto "particolare". E sì, devi implementare Comparator<Integer> .
    Il tuo comparator avrà il compare con 2 parametri Integer e ad ogni invocazione devi rispondere con un valore minore, maggiore o uguale a 0 per dire se il primo valore è minore, maggiore o uguale al secondo valore.

    Siccome è un ordinamento con regole particolari (il trattamento di 0), avrai 2 casi particolari:

    0 vs x (restituisci +1 per dire che 0 "viene dopo")
    x vs 0 (restituisci -1 per dire che x "viene prima")

    Nota: per x qui intendo qualunque valore non 0.

    Per qualunque altro caso puoi usare il compareTo di Integer, ovvero l'ordinamento "naturale" solito.

    Prova a scriverlo, per dubbi chiedi.
  • Re: Lista ordinamento

    Grazie mille per la risposta tempestiva...
    ti posto quello che ho scritto. Non mi è chiaro come fare il controllo quando 0 viene dopo e un valore diverso da 0 viene prima
    
    		List<Integer> lista=new ArrayList<Integer>();
    
    		
    		lista.add(0);
    		lista.add(2);
    		lista.add(1);
    		lista.add(3);
    		lista.add(2);
    		lista.add(4);
    	
    		Collections.sort(lista, new Comparator<Integer>() {
    
    
    			@Override
    			public int compare(Integer o1, Integer o2) {
    				if(o1.intValue() < o2.intValue())
    					
    					return -1;
    				else if(o1.intValue() == o2.intValue())
    					return 0;
    				
    				else 				
    					return 1;
    			}
    		});
    
  • Re: Lista ordinamento

    trap88 ha scritto:


    			public int compare(Integer o1, Integer o2) {
    				if(o1.intValue() < o2.intValue())
    					
    					return -1;
    				else if(o1.intValue() == o2.intValue())
    					return 0;
    				
    				else 				
    					return 1;
    			}
    
    Questo non è sbagliato. Ma non dà alcun caso "particolare" per 0. Insomma è un "normale" ordinamento per valore crescente.
    Dovresti cercare di "ragionare" un pochino ...
  • Re: Lista ordinamento

    Può andare bene cosi?
    
    		List<Integer> lista=new ArrayList<Integer>();
    
    		
    		lista.add(0);
    		lista.add(1);
    		lista.add(2);
    		lista.add(2);
    		lista.add(3);
    		lista.add(6);
    	
    		Collections.sort(lista, new Comparator<Integer>() {
    
    
    			@Override
    			public int compare(Integer o1, Integer o2) {
    				if(o1 < o2 || o2 == 0)
    					return -1;
    				else if(o1 == o2)
    					return 0;
    				
    				else 				
    					return 1;
    			}
    		});
    
  • Re: Lista ordinamento

    trap88 ha scritto:


    Può andare bene cosi?
    No, così no. (se lo provi lo vedi che non va ..)

    Anche se è un pochino più lungo, inizia a fare tutti i 4 casi ovvero un if-else principale per o1 == 0 e poi per ciascun ramo un if-else per o2 == 0:
    if (o1 == 0) {
        // fai if-else per o2 == 0
    } else {
        // fai if-else per o2 == 0
    }
  • Re: Lista ordinamento

    Hai ragione ho provato ma non funzione.
    sono ancora qui che cerco di capire quello che mi hai suggerito, ma perdoni, non riesco a seguirti.
    Cosa intendi per i 4 casi?
  • Re: Lista ordinamento

    trap88 ha scritto:


    Cosa intendi per i 4 casi?
    Si può in effetti anche semplificare a 3 casi:

    - 0 vs x, restituisci +1
    - x vs 0, restituisci -1
    - x vs y, usi compareTo e restitusci il suo risultato
  • Re: Lista ordinamento

    Perdonami, continuo a sbagliare ma non capisco dove...
    	
    	if(o1 == 0 || o2 ==0)
    					return -1;
    				else if(o1 < o2 || o2 < 0)
    					return -1;
    				else if(o1> o2 || o2 > 0)
    					return 1;
    				return 1;
    
  • Re: Lista ordinamento

    Se o1 è 0, restituisci +1
    altrimenti se o2 è 0, restituisci -1
    altrimenti compari o1 e o2 usando il compareTo() su o1
  • Re: Lista ordinamento

    Grazie mille!! Anche per la pazienza..
Devi accedere o registrarti per scrivere nel forum
10 risposte