Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Problema matrice di caratteri

    Ciao a tutti! Stavolta non ho sbagliato gli indici è un pò più grave la situzione! xD
    Sto facendo un programma in java che date n stringhe in input le salva in un vettore di String, salva ogni carattere delle stringhe in una matrice e la stampa in verticale. Il problema è che mi solleva la seguente eccezione:
    "Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(String.java:694)
    at Parole_verticali.main(Parole_verticali.java:25)"
    Vi posto il codice che ho scritto:
    codice:
    import java.util.*;
    
    public class Parole_verticali {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		int n, i, j, maxlung = 0;
    
    		
    		System.out.println("Quante frasi vuoi mettere:");
    		n = in.nextInt();
    		
    		String[] frase = new String[n];
    		
    		for(i = 0; i < n; i++) {
    			frase[i] = in.nextLine();	
    			if(frase[i].length() > maxlung)
    				maxlung = frase[i].length();
    		}
    
    		char Matrix[][] = new char[maxlung][n];
    
    		
    		for(i = 0;i < Matrix.length; i++){
    			for(j = 0; j < Matrix[i].length; j++) {
    				Matrix[j][i] = frase[i].charAt(j);
    			}
    		}
    		
    		for(i = 0;i < Matrix.length ;i++){
    			for(j = 0; j < Matrix[i].length; j++) {
    				System.out.printf("%c ", Matrix[i][j]);
    				System.out.println();
    			}
    		}
    	}
    }
    Come posso risolvere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    come puoi risolvere? Chi lo sa... vediamo intanto se così ottieni il risultato sperato
    codice:
    public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n, maxlung = 0;
            
            
            System.out.println("Quante frasi vuoi mettere:");
            n = in.nextInt();
            
            String[] frase = new String[n];
            
            System.out.println("Inserisci le frasi");
            int counter = 0;
            
            in = new Scanner(System.in);
            while (counter < n) {                    
                frase[counter] = in.nextLine();
                maxlung = (frase[counter].length() > maxlung ? frase[counter].length() : maxlung);
                counter++;
            }
            
            
            char Matrix[][] = new char[maxlung][n];        
            
            for(int i = 0; i < Matrix.length; i++) {
                for(int j = 0; j < Matrix[i].length; j++) {
                    Matrix[i][j] = (frase[j].length() > i ? frase[j].charAt(i) : ' ');
                }
            }
            
            for(int i = 0; i < Matrix.length ;i++){
                for(int j = 0; j < Matrix[i].length; j++) {
                    System.out.printf("%c ", Matrix[i][j]);				
                }
                System.out.println();
            }        
        }
    insomma, secondo me ci sono un po' di cosette poco chiare nel tuo codice (non so se siano poco chiare a me o a te ). Ad ogni modo, ammesso e non concesso che con il mio codice si ottenga il comportamento atteso, mi sento solo di dirti di provare a descrivere l'algoritmo (carta e penna) e provare a seguirlo passo passo... ti saresti reso/a subito conto di certi inghippi (siano essi dovuti sbadataggine o cattiva progettazione).
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Grazie mille! Funziona come deve! Adesso mi resta solo da capire cosa non andava nel mio codice! Grazie ancora

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    posso dirti quel che ho fatto io:

    - non conosco Scanner, però ho osservato uno strano comportamento dopo la lettura dell'int, per cui l'ho ri-inizializzato per la lettura di String. Mi documenterò.

    - mi sono accertato di leggere il numero corretto di entries String. Nel tuo codice c'era un ciclo for con poco significato (pensaci un attimo...) L'operatore ternario per definire maxlung è invece un eccesso di zelo, si poteva lasciare come avevi fatto tu.

    - il I ciclo for invece: è giusto, puoi avere array multi-dimensionali con buchi, ma poi bisogna anche stare attenti a come si interagisce con loro. Quello è l'unico vero barbatrucco che ho adottato.

    - il II ciclo for invece è sostanzialmente invariato (tranne che ho portato fuori il System.out.println() dell'acapo dal ciclo annidato, altrimenti ad ogni carattere andava acapo e non si otteneva l'effetto cosmetico voluto - ma questa è sicuramente una svista di cui ti saresti accorto/a se l'esecuzione fosse andata oltre l'eccezione che ricevevi)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.