Metodo compareTo

di il
9 risposte

Metodo compareTo

Ragazzi il mio compilatore si lamenta se scrivo questa funzione

	
	for( ;i<insiemeDiStringhe.size() ; i++)
	for( ;j<i;j--)
	if((String)insiemeDiStringhe.get(i).compareTo((String)insiemeDiStringhe.get(j)) >0)// qui si lamenta
				swapper(insiemeDiStringhe.get(i),insiemeDiStringhe.get(j));



InsiemeDiStringhe è un arrayList di tipo String non credo che concettualmente è sbagliato il mio ragionamento in sostanza individuo un'oggetto di tipo stringa lo casto per avere la primitiva string invoco il metodo compereTo e gli passo un altra stringa e controllo se la prima è maggiore... cosa sbaglio?

9 Risposte

  • Re: Metodo compareTo

    broke31 ha scritto:


    ragazzi il mio compilatore si lamenta se scrivo questa funzione
    	if((String)insiemeDiStringhe.get(i).compareTo((String)insiemeDiStringhe.get(j)) >0)// qui si lamenta
    L'accesso a membro con '.' ha priorità maggiore del cast, quindi:

    if (((String)insiemeDiStringhe.get(i)).compareTo.......

    Comunque due cose:
    1) Presumo stai usando ArrayList non parametrizzato. Se usi i generics, ti eviti quei cast (che come vedi complicano e rendono meno leggibile il codice).
    2) Non ho capito esattamente cosa stai cercando di fare. Stai cercando di ordinare l'ArrayList? Se non è un esercizio "didattico" in cui viene chiesto espressamente di implementare l'algoritmo di ordinamento .... allora usa Collections.sort()
  • Re: Metodo compareTo

    Il programma è per uso didattico la traccia dice sostanzialmente di creare tramite un interfaccia un algoritmo generico che ordini stringhe e altre classi viste nel corso.... ho quindi fatto un arrayList
    dichiarato nel seguente modo
    	ArrayList<String> insiemeDiStringhe=new ArrayList<String>();
    
    
    quindi è parametrico... presumo giusto??

    quindi mi consigli solo di controllare le precedenze ? ho anche un altro dubbio mettiamo caso che devo effettivamente scambiare i due oggetti a fine procedura lo scambio sarà ancora valido?? in sostanza non è che finisce la funzione e quindi non ha alcun'effetto?? come quando in c scambi due variabili per valore..
  • Re: Metodo compareTo

    broke31 ha scritto:


    ho quindi fatto un arrayList
    dichiarato nel seguente modo
    	ArrayList<String> insiemeDiStringhe=new ArrayList<String>();
    
    
    quindi è parametrico... presumo giusto??
    Sì, così è "parametrizzato". Quindi non hai bisogno dei cast espliciti.

    Pertanto:
    if (insiemeDiStringhe.get(i).compareTo(insiemeDiStringhe.get(j)) > 0)

    broke31 ha scritto:


    ho anche un altro dubbio mettiamo caso che devo effettivamente scambiare i due oggetti a fine procedura lo scambio sarà ancora valido?? in sostanza non è che finisce la funzione e quindi non ha alcun'effetto?? come quando in c scambi due variabili per valore..
    Non ho ovviamente visione del codice di swapper:
    swapper(insiemeDiStringhe.get(i),insiemeDiStringhe.get(j));

    Ma .... così è sicuramente errato. Perché a swapper stai passando una copia dei riferimenti ai due oggetti. Anche se in swapper scambi parametro1 <---> parametro2, stai alterando solo i due parametri ... NON il contenuto del ArrayList.

    Se vuoi alterare il contenuto di ArrayList devi usare il suo metodo set. E ti lascio anche un indizio interessante: se guardi la documentazione javadoc e vedi cosa restituisce set, riesci a fare lo scambio senza variabili di appoggio!
  • Re: Metodo compareTo

    Per eseguire lo swap quindi posso fare in questo modo
    int a=	nuovo.set(i, nuovo.get(j));
    	nuovo.set(j, a);
    
    
    resta il fatto che non riesco a fixare l'if che deve gestire questo...non si lamenta più il compilatore ma sto if è diventata una bomba appena prova ad eseguirla espode tutto... ti passo la funzione modificata con la set e l'if incriminato...
    
    
    void ordina()
    	{
    		String app;
    		app=new String();
    		for( ;i<insiemeDiStringhe.size() ; i++){
    			
    			for( ;j<i;j--)
    				if (insiemeDiStringhe.get(i).compareTo(insiemeDiStringhe.get(j)) > 0)// la prima è più grande    {
    				  app = insiemeDiStringhe.set(i, insiemeDiStringhe.get(j));
    						insiemeDiStringhe.set(j, app);
                                   }
    		}
    		
    		
    		
    	}
    
    
  • Re: Metodo compareTo

    broke31 ha scritto:


    per eseguire lo swap quindi posso fare in questo modo
    int a=	nuovo.set(i, nuovo.get(j));
    	nuovo.set(j, a);
    
    Come ho detto prima, si può anche evitare la variabile temporanea di appoggio.

    broke31 ha scritto:


    resta il fatto che non riesco a fixare l'if che deve gestire questo...non si lamenta più il compilatore ma sto if è diventata una bomba appena prova ad eseguirla espode tutto...
    
    		String app;
    		app=new String();
    		for( ;i<insiemeDiStringhe.size() ; i++){
    			
    			for( ;j<i;j--)
    				if (insiemeDiStringhe.get(i).compareTo(insiemeDiStringhe.get(j)) > 0)// la prima è più grande    {
    				  app = insiemeDiStringhe.set(i, insiemeDiStringhe.get(j));
    						insiemeDiStringhe.set(j, app);
                                   }
    		}
    
    Inizializzare app all'inizio non serve a niente (e comunque 'app' si può evitare).
    Ma quello che mi lascia perplesso è: 'i' e 'j' dove (e a cosa) sono inizializzate? Il punto è quello.
    Se vuoi implementare il "classico" bubble-sort ... beh:
    http://it.wikibooks.org/wiki/Implementazioni_di_algoritmi/Bubble_sort

    A questo livello c'è poco da "inventare".
  • Re: Metodo compareTo

    I e j sono stare inizializzate fuori... Il mio prof dice che le variabili devono essere messe nell'oggetto stesso... I parte da 0 e la j parte dalla fine dell'arraylist é proprio il bouble sort questo perché l'indice j si decrementa fino ad arrivare ad essere <di i strettamente... E i aumenta dopo la fine del primo for
  • Re: Metodo compareTo

    broke31 ha scritto:


    I e j sono stare inizializzate fuori... Il mio prof dice che le variabili devono essere messe nell'oggetto stesso...
    Le variabili che rappresentano lo "stato" di un oggetto sì .... due variabili di indice che servono solo in for dentro un metodo di ordinamento no.

    broke31 ha scritto:


    I parte da 0 e la j parte dalla fine dell'arraylist é proprio il bouble sort questo perché l'indice j si decrementa fino ad arrivare ad essere <di i strettamente... E i aumenta dopo la fine del primo for
    Non è comunque corretto: se guardi le implementazioni nella pagina linkata, vedi che l'indice del for interno (ri)parte sempre da un valore ben preciso. Nel tuo codice no.
  • Re: Metodo compareTo

    Sisi, hai ragione... ma ho ancora il problema che il mio programma esplode sempre a quel dannato if.... non riesco a capire proprio dove sia il mio errore... mi conviene postare tutto il sorgente, magari il problema è da qualche altra parte...bah

    se hai voglia leggi mi daresti una bella mano
    
    import java.util.ArrayList;
    
    
    public class Stringhe  {
    
    	
    	public void  Aggiungi(String nuovo)
    	{
    					 insiemeDiStringhe.add(nuovo);
    	}
    	
    	
    	
    	void ordina()// la dannata funzione incriminata
    	{
    		String app;
    		app=new String();
    		for(int i=0 ;i<insiemeDiStringhe.size() ; i++)
    			
    			for(int j=insiemeDiStringhe.size() ;j>i;j--)
    			{
    				if( insiemeDiStringhe.get(i).compareTo(insiemeDiStringhe.get(j))>0)
    				{// la prima è più grande
    				  app = insiemeDiStringhe.set(i, insiemeDiStringhe.get(j));
    						insiemeDiStringhe.set(j, app);
    				}
    			}
    	}
    
    
    	public String getString()
    	{
    		
    		return insiemeDiStringhe.get(f);
    		
    	}
    
                public int getI()
                 {
    	          return i;
    
                 }
    	ArrayList<String> insiemeDiStringhe=new ArrayList<String>();
    		int i=0; 
    		
    		int f=0;
    		
    }
    
    E questo è il tester:
    
    
    public class TesterMain {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		
    		Stringhe nuova=new Stringhe();
    		
    		nuova.Aggiungi("a");
    		nuova.Aggiungi("c");
    		nuova.Aggiungi("b");
    		nuova.Aggiungi("a");
    		
    		
    		nuova.ordina();
    		
    		
    		for(int i=0;i<nuova.getI();i++)
    		{
    			System.out.println(""+nuova.getString());
    		}
    
    	}
    
    }
    
    
    grazie...
  • Re: Metodo compareTo

    broke31 ha scritto:


    
    			for(int j=insiemeDiStringhe.size() ;j>i;j--)
    
    Forse non ti sei accorto che all'inizio, il primo valore di j è fuori dai limiti, perché è uguale al size.


    Inoltre in Stringhe i getI() e getString() non hanno molto senso così come sono fatti. Se vuoi esporre la stringa i-esima e il numero di stringhe, senza "esporre" l'ArrayList direttamente, allora fai 2 metodi:

    public String getStringa(int indice)
    public int getNumeroStringhe()

    (ovviamente metti i nomi che vuoi)
Devi accedere o registrarti per scrivere nel forum
9 risposte