Problema Insertion_Sort String

di il
28 risposte

28 Risposte - Pagina 2

  • Re: Problema Insertion_Sort String

    Mi è seccato pure disturbarti sempre. Casomai inviami l'intero codice dell'esercizio cosi lo studio con calma, x bene, e riesco a capire i miei dubbi. Grazie
  • Re: Problema Insertion_Sort String

    Adesso hai fatto ancora più confusione! Perché c'è uno Scanner dentro al metodo? Quel metodo non è concepito per CHIEDERE una parola all'utente e invertirla, ma per PRENDERE IN INPUT (passaggio di un PARAMETRO) una stringa e restituire (return) la stringa invertita. Devi limitare o evitare il dialogo con l'utente all'interno delle funzioni!
    Un buon prototipo per il metodo è
    
    public static String invertiStringa(String daInvertire)
    
    Cosa ti dice questo? Che il metodo prende come parametro (glielo passa qualcuno, ma a noi non interessa!) una stringa e restituisce una stringa. Punto. Tutto il resto (richiesta all'utente, lettura, ecc.) viene fatto altrove. Questo è solo un blocco funzionale che svolge l'operazione di inversione.

    Questa è la soluzione. Cerca di guardarla bene perché vedo che hai difficoltà anche negli algoritmi più semplici.
    public static String invertiStringa(String daInvertire) {
    		StringBuilder sb = new StringBuilder();
    		for(int i = daInvertire.length()-1; i>=0; i--) {
    			sb.append(daInvertire.charAt(i));
    		}
    		return sb.toString();
    	}
    PS. Non ti preoccupare per il disturbo: rispondo perché mi va, non mi obbliga mica nessuno!
  • Re: Problema Insertion_Sort String

    Ho inserito il codice. ho eseguito il programma e mi da questi errori xke??
    
    Exception in thread "main" java.lang.NullPointerException
    	at GestioneStringhe.invertiStringa(GestioneStringhe.java:89)
             	      StringBuilder sb = new StringBuilder();
    
    	at GestioneStringhe.main(GestioneStringhe.java:114)
                             gs.stampaLista();
    
    
  • Re: Problema Insertion_Sort String

    Prova a postare l'intero codice. Quel metodo è giusto: evidentemente c'è qualche errore quando lo richiami...
  • Re: Problema Insertion_Sort String

    Stavo cercando di modificare il codice e adesso eclipse mi chiede di inserire null come parametro del metodo stampaLista.Tu avevi consigliato di farlo generico, io l'ho fatto sia in quel modo k con il parametro listaDiStringhe. Perchè non funziona più?? Ti posto l'intero codice:
    
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    
    public class GestioneStringhe 
    {
    	public List<String> listaDiStringhe;
    	
    	public GestioneStringhe()
    	{
    		listaDiStringhe = new LinkedList<String>();
    		
    	}
    	
    	public void leggiStringhe()
    	{
    		 // creo un oggetto Scanner per leggere input da tastiera
            Scanner sc = new Scanner(new InputStreamReader(System.in));
    
            String line;
           
    
            // ciclo potenzialmente infinito
            while(true)           //(1 != 0) 
    		{
                System.out.print("Inserire parola: ");
    
                // leggo la riga inserita dall'utente
                line = sc.nextLine();
    
                // se la riga e' vuota allora smetto di leggere
                if(line.equals("")) break;
    
                     
    
                // aggiungo il numero alla lista
                listaDiStringhe.add(line);
    		}
            // chiudo lo scanner
            sc.close();
    	}
    
    	 /**
         * Metodo che stampa la lista
         */
        public void stampaLista(LinkedList<String> listaDiStringhe) 
    	{
            for(int i=0; i<listaDiStringhe.size(); i++) 
    		{
                System.out.println(listaDiStringhecasa.get(i));
            }
        }
    	
    	public List<String> getListaDiStringhe() {
    		return listaDiStringhe;
    	}
    
    	public void setListaDiStringhe(List<String> listaDiStringhe) {
    		this.listaDiStringhe = listaDiStringhe;
    	}
    	
    	//metodo per l'ordinamento di una lista di stringhe con insertion sort
    	public void insertionSort() {
    	      String tmp;             // questo cambia!
    	      int j;                      // questo NO!
    	      for(int i=1; i<listaDiStringhe.size(); i++) {
    	         j=i-1;
    	         tmp = listaDiStringhe.get(i);
    	         while(j >= 0 && listaDiStringhe.get(j).compareTo(tmp) > 0) {
    	            // "scorrimento"
    	        	 listaDiStringhe.set(j+1, listaDiStringhe.get(j));
    	            j--;
    	         }
    	         // inserimento
    	         listaDiStringhe.set(j+1, tmp);
    	      }
    	   }
    			
    			
    		
    	                 
    	
    	//metodo che, data una stringa in input, restituisce la stringa invertita
    	public static String invertiStringa(String daInvertire) 
    	{
    	      StringBuilder sb = new StringBuilder();
    	      for(int i = daInvertire.length()-1; i>=0; i--) 
    	      {
    	         sb.append(daInvertire.charAt(i));
    	      }
    	      return sb.toString();
    	} 
        
    	
    	/*public LinkedList<String> generaListaInvertita()
    	{
    		
    	}*/
    	
    	
        public static void main(String[] args)
        {
        	GestioneStringhe gs = new GestioneStringhe();
        	gs.leggiStringhe();
             System.out.println("Lista non ordinata:");
             gs.stampaLista();
             //contaScambi = 0;
             gs.insertionSort();
             //ols.Insertion_sort(null);
             System.out.println("Lista ordinata:");
             gs.stampaLista(null);
             //System.out.println("La lista e' stata ordinata con "+contaScambi+" scambi.");
        	gs.invertiStringa(null);
        //	gs.generaListaInvertita();
    	}
    }
    
    
  • Re: Problema Insertion_Sort String

    Ci sono diversi errori: te li ho segnalati con un commento nel codice.
    
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    
    public class GestioneStringhe 
    {
       public List<String> listaDiStringhe;
       
       public GestioneStringhe()
       {
          listaDiStringhe = new LinkedList<String>();
          
       }
       
       public void leggiStringhe()
       {
           // creo un oggetto Scanner per leggere input da tastiera
            Scanner sc = new Scanner(new InputStreamReader(System.in));
    
            String line;
           
    
            // ciclo potenzialmente infinito
            while(true)           //(1 != 0) 
          {
                System.out.print("Inserire parola: ");
    
                // leggo la riga inserita dall'utente
                line = sc.nextLine();
    
                // se la riga e' vuota allora smetto di leggere
                if(line.equals("")) break;
    
                     
    
                // aggiungo il numero alla lista
                listaDiStringhe.add(line);
          }
            // chiudo lo scanner
            sc.close();
       }
    
        /**
         * Metodo che stampa la lista
         */
        public void stampaLista(LinkedList<String> listaDiStringhe) 
       {
            for(int i=0; i<listaDiStringhe.size(); i++) 
          {
                System.out.println(listaDiStringhecasa.get(i));		// <-- listaDiStringhecasa ??? Cos'è casa ?? :-)
            }
        }
       
       public List<String> getListaDiStringhe() {
          return listaDiStringhe;
       }
    
       public void setListaDiStringhe(List<String> listaDiStringhe) {
          this.listaDiStringhe = listaDiStringhe;
       }
       
       //metodo per l'ordinamento di una lista di stringhe con insertion sort
       public void insertionSort() {
             String tmp;             // questo cambia!
             int j;                      // questo NO!
             for(int i=1; i<listaDiStringhe.size(); i++) {
                j=i-1;
                tmp = listaDiStringhe.get(i);
                while(j >= 0 && listaDiStringhe.get(j).compareTo(tmp) > 0) {
                   // "scorrimento"
                   listaDiStringhe.set(j+1, listaDiStringhe.get(j));
                   j--;
                }
                // inserimento
                listaDiStringhe.set(j+1, tmp);
             }
          }
             
             
          
                        
       
       //metodo che, data una stringa in input, restituisce la stringa invertita
       public static String invertiStringa(String daInvertire) 
       {
             StringBuilder sb = new StringBuilder();
             for(int i = daInvertire.length()-1; i>=0; i--) 
             {
                sb.append(daInvertire.charAt(i));
             }
             return sb.toString();
       } 
        
       
       /*public LinkedList<String> generaListaInvertita()
       {
          
       }*/
       
       
        public static void main(String[] args)
        {
           GestioneStringhe gs = new GestioneStringhe();
           gs.leggiStringhe();
             System.out.println("Lista non ordinata:");
             gs.stampaLista();	// <-- per come abbiamo definito il metodo, devi passare una lista
             //contaScambi = 0;
             gs.insertionSort();
             //ols.Insertion_sort(null);
             System.out.println("Lista ordinata:");
             gs.stampaLista(null);		// <-- per come abbiamo definito il metodo, devi passare una lista
             //System.out.println("La lista e' stata ordinata con "+contaScambi+" scambi.");
           gs.invertiStringa(null);		// <-- non va usato qui
        //   gs.generaListaInvertita();
       }
    }
    In particolare sono i seguenti:
    1. a un cero punto c'è "listaDiStringhecasa"... ti è scappato quel casa?
    2. non utilizzi correttamente il metodo stampaLista. Guarda la sua dichiarazione:
     public static void stampaLista(LinkedList<String> listaDiStringhe) 
    Si aspetta che ti gli passi un oggetto di tipo LinkedList, mentre tu non gli passi niente oppure gli passi null. Invece gli devi fornire, come parametro, la lista che deve stampare.
    Inoltre il metodo è di tipo static, quindi non lo devi richiamare sull'oggetto gs, ma proprio dalla classe GestioneStringhe.
    3. Il metodo invertiStringa non lo devi usare nel main ma nel metodo generaListaInvertita che devi ancora scrivere. Questo perché devi invertire le stringhe solo quando generi la seconda lista...
  • Re: Problema Insertion_Sort String

    Ok non mi da errore.
    3. Il metodo invertiStringa non lo devi usare nel main ma nel metodo generaListaInvertita che devi ancora scrivere. Questo perché devi invertire le stringhe solo quando generi la seconda lista...

    Quindi x creare una lista invertita bisogna richiamare il metodo invertiStringa e poi salvarla in una nuova lista??
  • Re: Problema Insertion_Sort String

    sballus ha scritto:


    Quindi x creare una lista invertita bisogna richiamare il metodo invertiStringa e poi salvarla in una nuova lista??
    Non proprio: tu devi utilizzare il metodo generaListaInvertita. L'idea è più o meno questa:
    - dal main richiami generaListaInvertita
    - questo metodo scorre la lista parola per parola
    - inverte ogni stringa grazie al metodo invertiStringa
    - salva la nuova parola (che ora è invertita) in una nuova lista
    - restituisce la nuova lista al main
  • Re: Problema Insertion_Sort String

    Stavo cercando di fare qualcosa ma mi sono bloccato:
    
    public LinkedList<String> generaListaInvertita(String daInvertire)
    	{
    		StringBuffer sbr = new StringBuffer ();
    		sbr.reverse();
    		return (LinkedList<String>) listaDiStringhe;
    	}	
    
  • Re: Problema Insertion_Sort String

    No, purtroppo non ha senso.
    Soprattutto quel return con il quale restituisci la solita lista (oltretutto dopo aver fatto un cast inutile).

    Soluzione:
    
    	public LinkedList<String> generaListaInvertita() {
    		// creo la nuova lista (vuota)
    		LinkedList<String> newList = new LinkedList<>();
    		
    		// scorro la vecchia lista
    		for(String s : list) {
    			// inverto ogni parola e la aggiungo alla nuova lista
    			newList.add(GestioneStringhe.invertiStringa(s));
    		}
    		return newList;
    	}
  • Re: Problema Insertion_Sort String

    Ultimissima cosa: non riesco a stampare la nuova lista invertita xke? Nel main mi da problemi xke non riesco a passargli la lista k voglio stampare
    
      public static void main(String[] args)
        {
        	GestioneStringhe gs = new GestioneStringhe();
        	gs.leggiStringhe();
             System.out.println("Lista non ordinata:");
             stampaLista(listaDiStringhe);
             gs.insertionSort();
            System.out.println("Lista ordinata:");
             stampaLista(listaDiStringhe);
           	gs.generaListaInvertita();
             //System.out.println("La lista e' stata invertita "+ );
            gs.stampaLista(newList);;
        }
        
    }
    
    
  • Re: Problema Insertion_Sort String

    Il metodo generaListInvertita restituisce la lista con le parole invertite: tu la devi memorizzare e poi passare al metodo che la stampa.

    Quindi
    
    		LinkedList<String> invertite = gs.generaListaInvertita();
    
  • Re: Problema Insertion_Sort String

    Ok grazie mille. Sei un grande!!!
  • Re: Problema Insertion_Sort String

    Felice di essere stato di aiuto.
    Visto che ora abbiamo terminato anche questo esercizio, ti posto il codice completo per come lo avevo scritto, con tutti i commenti.
    
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Scanner;
    
    public class GestioneStringhe {
    
    	LinkedList<String> list;
    
    	/**
    	 * Costruttore
    	 */
    	public GestioneStringhe() {
    		// inizializzazione lista
    		list = new LinkedList<>();
    	}
    	
    	
    	/**
    	 * Metodo "getter" per la lista
    	 * @return la lista
    	 */
    	public LinkedList<String> getList() {
    		return list;
    	}
    
    
    	/**
    	 * Metodo che stampa la lista
    	 */
    	public static void stampaLista(LinkedList<String> list) {
    		for(int i=0; i<list.size(); i++) {
    			System.out.println(list.get(i));
    		}
    	}
    
    
    	/**
    	 * Metodo che legge l'input dell'utente e memorizza le stringhe nella lista
    	 */
    	public void leggiStringhe() {
    		// creo un oggetto Scanner per leggere input da tastiera
    		Scanner sc = new Scanner(new InputStreamReader(System.in));
    
    		String line;
    
    		// ciclo potenzialmente infinito
    		while(1 != 0) {
    			System.out.print("Inserire stringa: ");
    
    			// leggo la riga inserita dall'utente
    			line = sc.nextLine();
    
    			// se la riga e' vuota allora smetto di leggere
    			if(line.equals("")) break;
    
    			// altrimenti aggiungo la stringa alla lista
    			list.add(line);
    		}
    
    		// chiudo lo scanner
    		sc.close();
    	}
    
    
    	/**
    	 * Metodo che ordina la lista tramite algoritmo InsertionSort
    	 */
    	public void insertionSort() {
    		String tmp;
    		int j;
    		for(int i=1; i<list.size(); i++) {
    			j=i-1;
    			tmp = list.get(i);
    			while(j >= 0 && list.get(j).compareTo(tmp) > 0) {
    				// "scorrimento"
    				list.set(j+1, list.get(j));
    				j--;
    			}
    			// inserimento
    			list.set(j+1, tmp);
    		}
    	}
    	
    	
    	/**
    	 * Metodo che inverte una stringa
    	 * @param daInvertire la stringa da invertire
    	 * @return la stringa invertita
    	 */
    	public static String invertiStringa(String daInvertire) {
    		StringBuilder sb = new StringBuilder();
    		for(int i = daInvertire.length()-1; i>=0; i--) {
    			sb.append(daInvertire.charAt(i));
    		}
    		return sb.toString();
    	}
    	
    	
    	/**
    	 * Metodo che genera una lista contenente tutte le stringhe invertite
    	 * @return la lista con le stringhe invertite
    	 */
    	public LinkedList<String> generaListaInvertita() {
    		// creo la nuova lista (vuota)
    		LinkedList<String> newList = new LinkedList<>();
    		
    		// scorro la vecchia lista
    		for(String s : list) {
    			// inverto ogni parola e la aggiungo alla nuova lista
    			newList.add(GestioneStringhe.invertiStringa(s));
    		}
    		return newList;
    	}
    
    
    
    	public static void main(String[] args) {
    		GestioneStringhe gs = new GestioneStringhe();
    
    		gs.leggiStringhe();
    		System.out.println("Lista non ordinata:");
    		GestioneStringhe.stampaLista(gs.getList());
    		
    		gs.insertionSort();
    		System.out.println("Lista ordinata:");
    		GestioneStringhe.stampaLista(gs.getList());
    		
    		LinkedList<String> invertite = gs.generaListaInvertita();
    		System.out.println("Lista con stringhe invertite:");
    		GestioneStringhe.stampaLista(invertite);
    	}
    
    }
    
    
    Ripeto comunque che questo non è l'unico modo e probabilmente ci sono strade migliori. Però... funziona!

Devi accedere o registrarti per scrivere nel forum
28 risposte