Stampa di Stringhe in Verticale

di il
7 risposte

Stampa di Stringhe in Verticale

Salve a tutti, sto riscontrando un problema nello svolgimento di un esercizio in Java.
Il programma deve prendere in input da tastiera tre stringhe e stamparle in verticale una affianco all'altra.
esempio:
cane
gatto
cavallo

diventano -->

cgc
aav
nta
etl
*tl
*oo

(gli asterischi li ho messi io, altrimenti non uscivano in colonna)

Questo che posto è il codice che ho scritto...
import java.util.Scanner;
public class ParallelVPrint10{
	public static void verticalString(String phrasea, String phraseb, String phrasec){
		for (int i = 0; i < phrasea.length() || i < phraseb.length() || i < phrasec.length(); i++){
			System.out.print(phrasea.charAt(i));
			System.out.print(phraseb.charAt(i));
			System.out.println(phrasec.charAt(i));
		}
	}
	public static void main(String[] args){
		String phrasea;
		String phraseb;
		String phrasec;

		Scanner keyboard = new Scanner(System.in);
		phrasea = keyboard.nextLine();
		phraseb = keyboard.nextLine();
		phrasec = keyboard.nextLine();

		verticalString(phrasea, phraseb, phrasec);
	}
}
ma mi da questo errore...
cane
gatto
cavallo
cgc
aaa
ntv
eta
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
	at java.lang.String.charAt(String.java:658)
	at ParallelVPrint10.verticalString(ParallelVPrint10.java:5)
	at ParallelVPrint10.main(ParallelVPrint10.java:20)
Ho capito che da quest'errore perchè, arrivato alla fine della stringa più corta, non sa più cosa stampare; ma non riesco a venire a capo di una soluzione.
Suggerimenti?

7 Risposte

  • Re: Stampa di Stringhe in Verticale

    ilpico22 ha scritto:


    Ho capito che da quest'errore perchè, arrivato alla fine della stringa più corta, non sa più cosa stampare; ma non riesco a venire a capo di una soluzione.
    La condizione

    i < phrasea.length() || i < phraseb.length() || i < phrasec.length()

    va anche bene. Ma poi nel for, per ciascuna stringa devi ripetere il test dell'indice nei confronti della lunghezza della stringa, per evitare di "sforare" su quelle più corte.
  • Re: Stampa di Stringhe in Verticale

    andbin ha scritto:


    ilpico22 ha scritto:


    Ho capito che da quest'errore perchè, arrivato alla fine della stringa più corta, non sa più cosa stampare; ma non riesco a venire a capo di una soluzione.
    La condizione

    i < phrasea.length() || i < phraseb.length() || i < phrasec.length()

    va anche bene. Ma poi nel for, per ciascuna stringa devi ripetere il test dell'indice nei confronti della lunghezza della stringa, per evitare di "sforare" su quelle più corte.
    Scusami, abbi pazienza ma sono ancora all'inizio, non ho capito cosa intendi per "ripetere il test dell'indice"...
  • Re: Stampa di Stringhe in Verticale

    ilpico22 ha scritto:


    Scusami, abbi pazienza ma sono ancora all'inizio, non ho capito cosa intendi per "ripetere il test dell'indice"...
    La condizione

    i < phrasea.length() || i < phraseb.length() || i < phrasec.length()

    è corretta. Il codice a priori non "sa" quale/i delle tre è la stringa più lunga. Quindi questa condizione permette all'indice di andare fino al "massimo" possibile per la stringa più lunga, qualunque delle tre sia. Se hai 3 lunghezze 5 7 9 oppure 9 5 7, l'indice i va da 0 compreso fino a 9 escluso. Proprio perché c'è la "or", basta che almeno una delle condizioni sia "vera" per continuare.

    Ma se ci sono stringhe più corte (es. 5 e 7 rispetto a 9) ovviamente NON puoi accedere fino ad 8! Ecco perché nel corpo del for devi ripetere il test per ciascuna stringa. Puoi farlo con un if per ciascuna stringa o in modo più furbo con l'operatore condizionale ? : (se lo conosci).
  • Re: Stampa di Stringhe in Verticale

    andbin ha scritto:


    ilpico22 ha scritto:


    Scusami, abbi pazienza ma sono ancora all'inizio, non ho capito cosa intendi per "ripetere il test dell'indice"...
    La condizione

    i < phrasea.length() || i < phraseb.length() || i < phrasec.length()

    è corretta. Il codice a priori non "sa" quale/i delle tre è la stringa più lunga. Quindi questa condizione permette all'indice di andare fino al "massimo" possibile per la stringa più lunga, qualunque delle tre sia. Se hai 3 lunghezze 5 7 9 oppure 9 5 7, l'indice i va da 0 compreso fino a 9 escluso. Proprio perché c'è la "or", basta che almeno una delle condizioni sia "vera" per continuare.

    Ma se ci sono stringhe più corte (es. 5 e 7 rispetto a 9) ovviamente NON puoi accedere fino ad 8! Ecco perché nel corpo del for devi ripetere il test per ciascuna stringa. Puoi farlo con un if per ciascuna stringa o in modo più furbo con l'operatore condizionale ? : (se lo conosci).
    Ho provato a scriverlo così, non so se era esattamente quello che stavi dicendo:
    import java.util.Scanner;
    public class ParallelVPrint10{
    	public static void verticalString(String phrasea, String phraseb, String phrasec){
    		for (int i = 0; i < phrasea.length() || i < phraseb.length() || i < phrasec.length(); i++){
    			if (i < phrasea.length()) System.out.print(phrasea.charAt(i));
    			if (i < phraseb.length()) System.out.print(phraseb.charAt(i));
    			if (i < phrasec.length()) System.out.print(phrasec.charAt(i));
    			System.out.println();
    		}
    	}
    	public static void main(String[] args){
    		String phrasea;
    		String phraseb;
    		String phrasec;
    
    		Scanner keyboard = new Scanner(System.in);
    		phrasea = keyboard.nextLine();
    		phraseb = keyboard.nextLine();
    		phrasec = keyboard.nextLine();
    
    		verticalString(phrasea, phraseb, phrasec);
    	}
    }
    Il problema è che finchè l'ordine delle stringhe viene inserito in ordine decrescente, il programma funziona; se invece l'ordine è casuale l'output non è più corretto.
    cavallo
    gatto
    cane
    cgc
    aaa
    vtn
    ate
    lo
    l
    o
    
    cane
    cavallo
    gatto
    ccg
    aaa
    nvt
    eat
    lo
    l
    o
  • Re: Stampa di Stringhe in Verticale

    ilpico22 ha scritto:


    Ho provato a scriverlo così, non so se era esattamente quello che stavi dicendo:
    Ma io dicevo: se l'indice per la tal stringa esiste, stampi il carattere i-esimo, ALTRIMENTI stampi l'asterisco.
  • Re: Stampa di Stringhe in Verticale

    andbin ha scritto:


    ilpico22 ha scritto:


    Ho provato a scriverlo così, non so se era esattamente quello che stavi dicendo:
    Ma io dicevo: se l'indice per la tal stringa esiste, stampi il carattere i-esimo, ALTRIMENTI stampi l'asterisco.
    Risolto! Nella fretta di provarlo dopo la lezione, non ho pensato ad inserire la condizione "spazio".
    Ti ringrazio per l'aiuto e per la pazienza!!!

    P.S.
    spero il meno possibile, ma probabilmente ci risentiremo su Java...
  • Re: Stampa di Stringhe in Verticale

    ilpico22 ha scritto:


    non ho pensato ad inserire la condizione "spazio".
    Asterisco, spazio o quello che si vuole, chiaramente.
    Prego.
Devi accedere o registrarti per scrivere nel forum
7 risposte