Pages: [1] 2 3   Go Down
Print
Author Topic: Esercizio caratteri consecutivi uguali  (Read 6659 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« 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


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;
    }
}
Logged
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #1 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.


Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #2 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  ?
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #3 on: 19-01-2009, 16:15:54 »

io torno semplicemente null è la soluzione più veloce e credo anche la più ovvia.
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« Reply #4 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. e tra l'altro in questo toglie solo un carattere, l'altro uguale lo lascia.
Logged
hax
Matricola
*
Offline Offline

Posts: 64


« Reply #5 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.
Logged
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #6 on: 20-01-2009, 18:30:52 »

Oppure metti k<= A[j].lenght()-1 .....
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« Reply #7 on: 12-02-2009, 15:25:35 »

Con il cambiamento al codice ancora non mi torna quello che dovrebbe.. testate non mi elimina entrambi i caratteri uguali.
Logged
KingDavid
Forumista
***
Offline Offline

Posts: 788


Alla fine [...] tutta la realtà è binaria.


« Reply #8 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;
    }
}
« Last Edit: 12-02-2009, 16:10:40 by KingDavid » Logged

Basti pensare che un ipotetico quadrato di specchi, lungo 200 chilometri per ogni lato, potrebbe produrre tutta l'energia necessaria all'intero pianeta.
(Carlo Rubbia)
KingDavid
Forumista
***
Offline Offline

Posts: 788


Alla fine [...] tutta la realtà è binaria.


« Reply #9 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;
    }
}
Logged

Basti pensare che un ipotetico quadrato di specchi, lungo 200 chilometri per ogni lato, potrebbe produrre tutta l'energia necessaria all'intero pianeta.
(Carlo Rubbia)
Vivynz
Forumista Eroico
*****
Offline Offline

Gender: Female
Posts: 2.033


File reality.sys corrupted, Reboot Universe? Y/N


« Reply #10 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);
}
}
Logged

L'odrine delle lttere dnetro una praorla non è ipmortatne, la sloa cosa ipmortatne è che la pmria e l'utlima ltteera sinao nel potso giutso. Il rseto può essree in un dsiodrine più totlae e voi ptoerte smerpe lggeree sneza porblmea.
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« Reply #11 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  I 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?
Logged
KingDavid
Forumista
***
Offline Offline

Posts: 788


Alla fine [...] tutta la realtà è binaria.


« Reply #12 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  I 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. 
Cmq certo che puoi usare il substring, l'importante è che l'algoritmo sia corretto, cioè che dia il risultato aspettato.
Logged

Basti pensare che un ipotetico quadrato di specchi, lungo 200 chilometri per ogni lato, potrebbe produrre tutta l'energia necessaria all'intero pianeta.
(Carlo Rubbia)
KingDavid
Forumista
***
Offline Offline

Posts: 788


Alla fine [...] tutta la realtà è binaria.


« Reply #13 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
Logged

Basti pensare che un ipotetico quadrato di specchi, lungo 200 chilometri per ogni lato, potrebbe produrre tutta l'energia necessaria all'intero pianeta.
(Carlo Rubbia)
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« Reply #14 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
 

Sto cercando di modificare anche il codice che avevo fatto io ma ancora senza successo  testate
Logged
Pages: [1] 2 3   Go Up
Print
Jump to: