Problema con invertire stringhe.

di il
10 risposte

Problema con invertire stringhe.

Il problema in questione è questo:
Si realizzi un programma che definisca il metodo inverti che accetta in ingresso una stringa daInvertire e un intero n e restituisce una stringa con i caratteri invertiti a partire dal carattere di indice n, se l'indice è valido.

Questo è il programma che ho scritto

	public static String Inverti (String daInvertire, int n) {
		String invertita = "";
		int count = 1;
		for (int i = 0; i<daInvertire.length(); i++) {
			if (daInvertire.length()-(daInvertire.length()-(i+1))<n) {
				invertita = invertita + daInvertire.charAt(i);
			}
			else {
				invertita = invertita + daInvertire.charAt(daInvertire.length()-count);
			}
			count--;
		}
		return invertita;
Mi restituisce l'errore String index out of range : 14 nell'istruzione else. Non riesco a capire cosa c'è che non va. Qualcuno mi può aiutare? Grazie

10 Risposte

  • Re: Problema con invertire stringhe.

    Mi sembra un po' contorto ....

    Se non hai indicazioni o vincoli particolari, io otterrei l'array di char[] (toCharArray() di String) e poi manipolerei questo e alla fine ricreo un nuovo String dall'array. Poi basta un semplice for, non servono test o condizioni particolari.

    Beh, si può fare in diversi modi, in effetti.
  • Re: Problema con invertire stringhe.

    andbin ha scritto:


    Mi sembra un po' contorto ....

    Se non hai indicazioni o vincoli particolari, io otterrei l'array di char[] (toCharArray() di String) e poi manipolerei questo e alla fine ricreo un nuovo String dall'array. Poi basta un semplice for, non servono test o condizioni particolari.

    Beh, si può fare in diversi modi, in effetti.
    L'esercizio nel libro è prima della spiegazione degli arrray, vorrei riuscire a finirlo senza utilizzarli. Tu come lo faresti?
  • Re: Problema con invertire stringhe.

    SrJustEasy ha scritto:


    vorrei riuscire a finirlo senza utilizzarli.
    Ok. Io farei innanzitutto un substring per prendere la parte da non toccare. Qui però devi sapere tu come trattare quel indice ricevuto. Può essere negativo? In tal caso è da trattare come errore o come "tutto da invertire"? Se è oltre l'ultimo indice valido, idem, è da trattare come errore o come "nulla da invertire"?
    Questo implica alcuni test basilari sull'indice, prima di fare un substring.

    Poi dopo la parte fissa accoderei i caratteri della stringa prendendoli iniziando dall'ultimo indice valido fino all'indice di inizio.
  • Re: Problema con invertire stringhe.

    andbin ha scritto:


    SrJustEasy ha scritto:


    vorrei riuscire a finirlo senza utilizzarli.
    Ok. Io farei innanzitutto un substring per prendere la parte da non toccare. Qui però devi sapere tu come trattare quel indice ricevuto. Può essere negativo? In tal caso è da trattare come errore o come "tutto da invertire"? Se è oltre l'ultimo indice valido, idem, è da trattare come errore o come "nulla da invertire"?
    Questo implica alcuni test basilari sull'indice, prima di fare un substring.

    Poi dopo la parte fissa accoderei i caratteri della stringa prendendoli iniziando dall'ultimo indice valido fino all'indice di inizio.
    Bene, così dovrebbe andare
    public static String Inverti (String daInvertire, int n) {
    		if(n>=0 && n<daInvertire.length()) {
    			String invertita = daInvertire.substring(0, n-1);
    			daInvertire = daInvertire.substring(n-1, daInvertire.length());
    			for (int i = daInvertire.length()-1; i>=0; i--) {
    				invertita = invertita + daInvertire.charAt(i);
    			}
    			return invertita;
    		}
    		else {
    			System.out.println("Nella stringa non c'è la posizione inserita, programma terminato.");
    			return "";
    		}
    		
    	}
    Grazie mille
  • Re: Problema con invertire stringhe.

    SrJustEasy ha scritto:


    Bene, così dovrebbe andare
    No, è ancora sbagliato. Il primo parametro di substring è inclusivo ma il secondo è esclusivo, quindi se passi n-1 ti "perdi" un carattere. Che poi "guarda caso" riprendi nella inversione perché il secondo substring parte proprio da n-1.
    E comunque il for è migliorabile perché non servirebbe il secondo substring.
  • Re: Problema con invertire stringhe.

    andbin ha scritto:


    No, è ancora sbagliato. Il primo parametro di substring è inclusivo ma il secondo è esclusivo, quindi se passi n-1 ti "perdi" un carattere. Che poi "guarda caso" riprendi nella inversione perché il secondo substring parte proprio da n-1.
    Ah giusto l'indice finale non è compreso. Quindi dovrei scrivere n per la fine del primo substring e di nuovo n per l'inizio del secondo, giusto?

    andbin ha scritto:


    E comunque il for è migliorabile perché non servirebbe il secondo substring.
    Mi sembrava il metodo più veloce... Come lo scriveresti? Non trovo altro da implementare al ciclo for
  • Re: Problema con invertire stringhe.

    SrJustEasy ha scritto:


    Quindi dovrei scrivere n per la fine del primo substring

    SrJustEasy ha scritto:


    Mi sembrava il metodo più veloce... Come lo scriveresti? Non trovo altro da implementare al ciclo for
    Il secondo substring non serve. Hai preso la parte fissa. Ora basta fare un for da un i=lunghezza-1 (che è l'ultimo indice valido) andando indietro "finché è >= inizio" (inizio indice di inizio della inversione)
  • Re: Problema con invertire stringhe.

    Il secondo substring non serve. Hai preso la parte fissa. Ora basta fare un for da un i=lunghezza-1 (che è l'ultimo indice valido) andando indietro "finché è >= inizio" (inizio indice di inizio della inversione)
    Allora alla fine è risultato questo
    
    for (int i = daInvertire.length()-1; i>=daInvertire.length()-(daInvertire.length()-n); i--) {
    				invertita = invertita + daInvertire.charAt(i);
    
    Grazie mille
  • Re: Problema con invertire stringhe.

    SrJustEasy ha scritto:


    Allora alla fine è risultato questo
    Quasi .....

    Matematica elementare alla mano: come semplifichi

    daInvertire.length()-(daInvertire.length()-n)

    ?
  • Re: Problema con invertire stringhe.

    andbin ha scritto:


    SrJustEasy ha scritto:


    Allora alla fine è risultato questo
    Quasi .....

    Matematica elementare alla mano: come semplifichi

    daInvertire.length()-(daInvertire.length()-n)

    ?
    Non ci posso credere di non essermene accorto ahahahahah
    Ok, dovrei esserci
    public static String Inverti (String daInvertire, int n) {
    		if(n>=0 && n<daInvertire.length()) {
    			String invertita = daInvertire.substring(0, n);
    			for (int i = daInvertire.length()-1; i>=n; i--) {
    				invertita = invertita + daInvertire.charAt(i);
    			}
    			return invertita;
    		}
    		else {
    			System.out.println("Nella stringa non c'è la posizione n, programma terminato.");
    			return "";
    		}
    		
    	}
    Grazie ancora
Devi accedere o registrarti per scrivere nel forum
10 risposte