Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: ShiShi on 19-01-2009, 10:41:48



Title: Esercizio caratteri consecutivi uguali
Post by: ShiShi on 19-01-2009, 10:41:48
Questo è quello che ho fatto io..
Stampa però tutte le stringe private dell'ultimo carattere, ma se tolgo il -1 a A.length() quando devo stampare mi appare l'errore di uscire fuori dall'array. E' un errore che mi capita a volte sì e altre no in questi tipi di esercizi dove bisogna confrontare caratteri contigui. C'è un modo per farli correttamente?
Poi non ho  capito se vuole stampata solo la stringa e non tutto l'array. In entrambi i casi l'errore non riesco a risolverlo.
Grazie a chi mi potrà aiutare .smile

Code:
/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato S di stringhe, e cerchi
se esiste una stringa di S in cui occorrono due caratteri consecutivi uguali (ad es. “abbcde”). In tal
caso il metodo deve restituire tale stringa privata dei due caratteri uguali.*/

public class Eser {
    public static void main ( String [] args ) {
        String [][] A = { { "ica" , "dom" , "lucaa" } ,
                       { "luc" , "lit" } ,
                       { "ndra" , "lito"}};
                       A = metodo (A);
                       for (int i=0; i<A.length; i++)
                         for (int j=0; j<A[i].length; j++)
        System.out.println ( A[i][j]+"|" );
    }
static String [][]metodo (String[][]A) {
    for (int i=0; i<A.length; i++)
        for (int j=0; j<A[i].length; j++)
        {
            A[i][j] = metodo2 (A[i][j]);
        }
        return A;
    }

static String metodo2 (String A) {
    String U = "";
    String T = "";
    String Tot = "";
       for (int i=0; i<A.length()-1; i++)
               if (!(A.charAt(i) == A.charAt(i+1)))
                U += A.charAt(i);
               return U;
    }
}


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Aigor on 19-01-2009, 11:27:16
Code:
/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato S di stringhe, e cerchi
se esiste una stringa di S in cui occorrono due caratteri consecutivi uguali (ad es. “abbcde”). In tal
caso il metodo deve restituire tale stringa privata dei due caratteri uguali.*/

public class Eser {
    public static void main ( String [] args ) {
        String [][] A = { { "ica" , "dom" , "lucaa" } ,
                       { "luc" , "lit" } ,
                       { "ndra" , "lito"}};
                     
        System.out.println(metodo (A));
                     
    }
static String metodo (String[][]A) {
    String s="";
    boolean semaforo=false;
   
    for (int i=0; i<A.length; i++)
        for (int j=0; j<A[i].length && semaforo==false; j++)
        {
            s="";
            for (int k=0; k<A[i][j].length()-1; k++)
               if ((A[i][j].charAt(k) != A[i][j].charAt(k+1)))
                    s+=A[i][j].charAt(k);
               else
                   semaforo=true;
           }
    if(semaforo)
        return s;
    else   
        return null;
}
   
}
       

L'esercizio vuole che stampi solo la stringa senza i caratteri ripetuti. Guardati questa versione che è più piccola e fa uso di un solo metodo.
Per quanto riguarda quell'errore sicuramente si sarà presentato al momento dello scorrimento di una stringa. La charAt nel tuo for parte da zero quindi l'ultimo elemento sarà numero_elementi -1 .
Altrimenti togliendo il -1 rischi di andare a leggere un elemento non presente e quindi ti genera l'eccezione StringIndexOutOfBoundsException.



Title: Re:Esercizio caratteri consecutivi uguali
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-01-2009, 13:12:51
Scusate ma il metodo così descritto non è totale (cioè definito su tutti gli input): ovvero cosa bisogna restituire se la condizione non si verifica mai? Va bene entrare in un bel loop infinito  .smile?


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Aigor on 19-01-2009, 16:15:54
io torno semplicemente null è la soluzione più veloce e credo anche la più ovvia.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 20-01-2009, 15:59:57
Quello che mi avete suggerito non funziona come dovrebbe, è lo stesso errore che dava il mio, toglie l'ultimo carettere quando stampa. Infatti se invece di mettere "lucaa" metto "luuca" mi stampa "luc".

E' il problema che infatti non riesco a risolvere. .poverinoi e tra l'altro in questo toglie solo un carattere, l'altro uguale lo lascia.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: hax on 20-01-2009, 16:11:38
perchè il ciclo si ferma a length()-1 e l'ultimo carattere viene escluso...
Quando esci dal ciclo aggiungi l'ultimo carattere alla stringa creata, tanto essendo l'ultimo non può essere ripetuto.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Aigor on 20-01-2009, 18:30:52
Oppure metti k<= A[j].lenght()-1 .....


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 12-02-2009, 15:25:35
Con il cambiamento al codice ancora non mi torna quello che dovrebbe.. :-)| non mi elimina entrambi i caratteri uguali.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 12-02-2009, 15:59:30
Ho risolto il tuo problema così
Code:
/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato S di stringhe, e cerchi
se esiste una stringa di S in cui occorrono due caratteri consecutivi uguali (ad es. “abbcde”). In tal
caso il metodo deve restituire tale stringa privata dei due caratteri uguali.*/

public class CheckDouble
{
    public static void main ( String [] args )
    {
      String [][] A = { { "ica" , "dom" , "luucaa" } ,
                       { "luc" , "lit" } ,
                       { "ndra" , "lito"}};
      for (int i=0; i<A.length; i++)
        for (int j=0; j<A[i].length; j++)
        {
            //String str ="";
            A[i][j]+=" ";
            for(int a=0; a < A[i][j].length()-1; a++)
                if(A[i][j].charAt(a) != A[i][j].charAt(a+1)) 
                //str +=
                   System.out.print(A[i][j].charAt(a));
            System.out.println();
        }
                      
                     
    }

}

Nel tuo codice ti basterebbe mettere
Code:
A += " ";

nel metodo2() sotto String Tot, l'importante è che sia prima del for.
Il problema è dato dal fatto che se il penultimo carattere è uguale all'ultimo non lo stampa, ma poi non è possibile controllare l'ultimo perchè si esce dal ciclo for. Ci sono diverse soluzioni, io ho aggiunto un carattere vuoto in coda alla stringa in questo modo anche se il penultimo e l'ultimo carattere sono identici, ne verrà stampato almeno uno perchè l'ultimo carattere viene confrontato con lo spazio vuoto.
Un' altra soluzione potrebbe essere quella di controllare se l'indice i è uguale a A.length()-2 e se
A.charAt(i) == A.charAt(i+1) allora stampa ugualmente.
Quindi modificare il metodo2 in
Code:
static String metodo2 (String A) {
    String U = "";
    String T = "";
    String Tot = "";
   
       for (int i=0; i<A.length()-1; i++)
               
            if (!(A.charAt(i) == A.charAt(i+1)) || ((A.charAt(i) == A.charAt(i+1)) && (i == A.length()-2) ))
                U += A.charAt(i);
         
            return U;
    }
}


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 12-02-2009, 16:22:16
la soluzione suggerita  da hax è + elegante, cioè
Code:
static String metodo2 (String A) {
    String U = "";
    String T = "";
    String Tot = "";
   
       for (int i=0; i<A.length()-1; i++)
               if (!(A.charAt(i) == A.charAt(i+1)))
                U += A.charAt(i);
       U+=A.charAt(A.length()-1);
            return U;
    }
}


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Vivynz on 12-02-2009, 18:08:27
io a suo tempo l'avevo fatto così
Code:
/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato S di stringhe, e cerchi
se esiste una stringa di S in cui occorrono due caratteri consecutivi uguali (ad es. “abbcde”). In tal
caso il metodo deve restituire tale stringa privata dei due caratteri uguali*/
public class Es38
{
public static String strSenzaDoppie(String[][] S)
{
String str="";
for(int r=0;r<S.length;r++)
for(int c=0;c<S[r].length;c++)
for(int i=0;i<S[r][c].length()-1;i++)
if(S[r][c].charAt(i)==S[r][c].charAt(i+1))
{
str=S[r][c];
str=rimuoviChar(str,i);
return str;
}
return "la stringa non esiste";
}
private static String rimuoviChar(String s,int indice)
{
String s1=s.substring(0,indice)+s.substring(indice+1,s.length());
return s1;
}
public static void main (String[] args)
{
String[][] str={{"casa","albero","piano"},{"sedia","tremila","fiorre","quadro"},{"baule","libro"},{"matita","camino","divano"}};
String s=strSenzaDoppie(str);
System.out.println(s);
}
}


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 13-02-2009, 13:01:38
Grazie per le risposte, ho corretto il mio codice come mi avete consigliato e non ho più il problema dell'ultima stringa saltata  :-K ma non ho capito se ho interpretato male il testo io. Se per esempio la parola è 'ciaao' non dovrebbe tornare 'cio' togliendo entrambe le lettere uguali?
In tutti i codici che mi avete postato, compreso il mio si toglie solo una lettera delle due uguali?E' giusto così?
E altra cosa è possibile usare il substring, il prof lo accetta?


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 13-02-2009, 13:23:08
Grazie per le risposte, ho corretto il mio codice come mi avete consigliato e non ho più il problema dell'ultima stringa saltata  :-K ma non ho capito se ho interpretato male il testo io. Se per esempio la parola è 'ciaao' non dovrebbe tornare 'cio' togliendo entrambe le lettere uguali?
In tutti i codici che mi avete postato, compreso il mio si toglie solo una lettera delle due uguali?E' giusto così?
E altra cosa è possibile usare il substring, il prof lo accetta?
Hai ragione tu!! E' vero si devono togliere entrambi i caratteri uguali... non ho letto bene il testo con la fretta.  .arrossisco
Cmq certo che puoi usare il substring, l'importante è che l'algoritmo sia corretto, cioè che dia il risultato aspettato.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 13-02-2009, 13:25:50
Se vuoi un suggerimento nel metodo2() devi utlizzare un ciclo while in questo modo hai un controllo totale dell'indice i e puoi saltare di quanto vuoi. Però ci sono diverse soluzioni, usa quella che ti viene meglio e se hai qualche problema posta.  :-ciao


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 13-02-2009, 15:50:20
Code:
private static String rimuoviChar(String s,int indice)
{
String s1=s.substring(0,indice)+s.substring(indice+1,s.length());
return s1;
}
Con il codice di Vivynz non è nulla mi è bastato mettere un +2 invece di indice+1
 .whistling

Sto cercando di modificare anche il codice che avevo fatto io ma ancora senza successo  :-)|


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Vivynz on 13-02-2009, 16:21:28
Si hai ragione è stata una distrazione!comunque i metodi si possono usare tutti tranne che il prof non lo specifichi nel testo!


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 13-02-2009, 16:25:37
Il metodo substring mi sembra però non lo vieti mai, non ho visto nessun compito dove specifica di non usarlo, anche perchè il metodo che hai fatto tu mi risolve tantissimi problemi, in quello mio non riesco proprio a trovare una soluzione senza usare substring  :boh


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Vivynz on 13-02-2009, 16:59:18
bè si ovviamente quel metodo semplifica il lavoro  .smile


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 13-02-2009, 17:09:29
Il metodo substring mi sembra però non lo vieti mai, non ho visto nessun compito dove specifica di non usarlo, anche perchè il metodo che hai fatto tu mi risolve tantissimi problemi, in quello mio non riesco proprio a trovare una soluzione senza usare substring  :boh
Il metodo substring (qualora il prof. lo vietasse) lo potresti implementare tu tranquillamente. Anzi te lo propongo come esercizio. Il nostro prof. delle superiori ce lo fece fare a terzo anno. Quindi non è difficile. In ogni caso, il prof. non vieta mai di usare i metodi delle librerie java.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Vivynz on 13-02-2009, 17:19:06
In ogni caso, il prof. non vieta mai di usare i metodi delle librerie java.
bè a volte dice di utilizzare solo alcuni metodi oppure di non utilizzarne altri è capitato!


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 13-02-2009, 17:41:00
In ogni caso, il prof. non vieta mai di usare i metodi delle librerie java.
bè a volte dice di utilizzare solo alcuni metodi oppure di non utilizzarne altri è capitato!
Se è cosi, allora meglio essere pronti a risolvere gli esercizi con metodi "personali".  .wink


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Fr3d3R!K on 13-02-2009, 19:09:42
bravo kingdavid anche perchè sono capitato esercizi di questo tipo (un esempio per tutti quello del dizionario dove sono vietati i metodi di ordinamento)...


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 13-02-2009, 19:38:19
bravo kingdavid anche perchè sono capitato esercizi di questo tipo (un esempio per tutti quello del dizionario dove sono vietati i metodi di ordinamento)...
.arrossisco grazie


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 15-02-2009, 19:57:35
Tenendo conto del tuo consiglio KingDavid ho fatto con il while e ho risolto il problema senza il substring  .applausi
Sono di una lentezza spaventosa per fare un esercizio, dettagli....bah

Code:
/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato S di stringhe, e cerchi
se esiste una stringa di S in cui occorrono due caratteri consecutivi uguali (ad es. “abbcde”). In tal
caso il metodo deve restituire tale stringa privata dei due caratteri uguali.*/

public class Eser {
    public static void main ( String [] args ) {
        String [][] A = { { "cane" , "gatto" , "topo" } ,
                       { "scimmia" , "cricetoo" } ,
                       { "panda" , "orso"}};
                       A = metodo (A);
                       for (int i=0; i<A.length; i++)
                         for (int j=0; j<A[i].length; j++)
        System.out.print ( A[i][j]+"|" );
    }
static String [][]metodo (String[][]A) {
    for (int i=0; i<A.length; i++)
        for (int j=0; j<A[i].length; j++) {
            A[i][j] = metodo2 (A[i][j]);
        }
        return A;
    }

static String metodo2 (String A) {
    String U = "";
    int i = 0;
       while (i<A.length()-1 && (A.charAt(i) != A.charAt(i+1))) {
              U += A.charAt(i);
              i++;
            }
    i+=2;
        while (i<A.length()-1 && (A.charAt(i) != A.charAt(i+1))) {
         U += A.charAt(i);
         i++;
        }
if (!(A.charAt(A.length()-2) == A.charAt(A.length()-1))) {
       U += A.charAt(A.length()-1);
}
     return U;
    } 
}


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Vivynz on 15-02-2009, 20:49:28
è normale la lentezza ma più esercizi fai e più ti velocizzi! :-OK


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 15-02-2009, 22:21:50
Lo spero...mi è di sicuro molto utile l'aiuto di voi del forum, molti errori ci sarei stata il doppio del tempo a capirli da sola .smile


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 16-02-2009, 15:22:03
Lo spero...mi è di sicuro molto utile l'aiuto di voi del forum, molti errori ci sarei stata il doppio del tempo a capirli da sola .smile
Ciao ben fatto complimenti!
Sai volevo solo dirti che un altro modo di fare il metodo2() sarebbe questo
Code:
static String metodo2 (String A) {
    String U = "";

    int i=0;
    boolean equals = false; //controlla se gli ultimi due caratteri sono uguali
    while(i<A.length()-1)
    {
       
        if (!(A.charAt(i) == A.charAt(i+1)))
        {
            U += A.charAt(i);
            i++;
            equals=false;
        }
        else
        {
            i+=2;
            equals=true;
        }
    }
    if(!equals)
      U+=A.charAt(A.length()-1);
    return U;
  } 
}

dagli una occhiata e confrontalo col tuo.


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 19-02-2009, 12:00:56
King ho provato il tuo codice, ma c'è un problema: se le due lettere uguali sono penultime all'ultima della stringa non stampa l'ultima. Esempio in "gatto" dovrebbe stampare "gao" invece nel tuo codice stampa "ga" salta l'ultima. .penso


Title: Re:Esercizio caratteri consecutivi uguali
Post by: CollegaCaparezza on 19-02-2009, 12:06:02
Per caso avete altri eseizzi sui metodi che potrei fare per la prima prova????
 :[Emoticon] PC Asd:


Title: Re:Esercizio caratteri consecutivi uguali
Post by: isuccia89 on 19-02-2009, 12:16:24
Per caso avete altri eseizzi sui metodi che potrei fare per la prima prova????
 :[Emoticon] PC Asd:
.quoto


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Fr3d3R!K on 19-02-2009, 13:41:09
tutti gli esercizi disponibili sono stati postati sul forum (e raggiungono se non il centinaio di esercizi almeno la cinquantina), basta cercare. Fatti tutti quelli che ci sono, se ancora vi rimane tempo, giratevi i pollici perchè non avrete più da esercitarvi su nulla  :-OK .wink


Title: Re:Esercizio caratteri consecutivi uguali
Post by: KingDavid on 19-02-2009, 15:05:21
King ho provato il tuo codice, ma c'è un problema: se le due lettere uguali sono penultime all'ultima della stringa non stampa l'ultima. Esempio in "gatto" dovrebbe stampare "gao" invece nel tuo codice stampa "ga" salta l'ultima. .penso

grazie della segnalazione!
Si deve correggere l'if finale nel metodo 2
Code:
if(!equals || i==A.length()-1)


Title: Re:Esercizio caratteri consecutivi uguali
Post by: Root on 19-02-2009, 17:01:40
http://www.mytwocent.it/appunti.php?action=25

appunto titolato Seconda Prova

Buono Studio :)
Dario


Title: Re:Esercizio caratteri consecutivi uguali
Post by: ShiShi on 20-02-2009, 11:02:47
@King mi piace comunque il tuo metodo più del mio, lo trovo un pò meno complicato  .wink