Pages: 1 [2] 3   Go Down
Print
Author Topic: Dubbio su array frastagliati  (Read 6044 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Luxandro
Apprendista Forumista
**
Offline Offline

Posts: 307



« Reply #15 on: 27-01-2011, 19:10:13 »

vero nn serve qua trovare il max, e invece cmq luxandro hai bisogno di una piccola correzione. il carattere deve ripetersi una sola volta, nn specifica che devono essere in due stringhe diverse...quindi se si trova nella stessa parola va bene pure. se avesse messo,supponiamo che le stringhe contengano caratteri tutti diversi tra loro.
salvo vorrei darti un consiglio nell'operare con i booleani. in quel caso dato che stai usando il boolean trovato, appena diventa true, non continua con i cicli ma esce fuori. quindi puoi mettere un unico return alla fine scrivendo return trovato;
sull'errore che esce fuori di uno dalla stringa sinceramente nn ti so dire...il ciclo che gestisce la lunghezza della stringa mi pare corretto...

Grazie!  
Logged

"Quando non stai guardando è come un'onda. Quando guardi è come una particella!"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #16 on: 27-01-2011, 23:59:45 »

Code:
Grazie ragazzi siete stati utili !!!
« Last Edit: 28-01-2011, 00:03:45 by salvopuglisi » Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #17 on: 28-01-2011, 00:04:20 »

Ragazzi volevo sapere come avevo svolto l'esercizio (se può andare insomma) e se ci sono degli errori gravi   .. Vi ringrazio
Code:
/* Scrivere un metodo che prenda in input un array bidimensionale frastagliato A di stringhe,
e restituisca un boolean che indichi se esiste in A una colonna contenente tre stringhe con
lo stesso carattere finale ( Attenzione alle stringhe mancanti!). */

public boolean metodo (String [][] A)
{

char final=' ',final1=' ';
int m=A[0].length,cont=0;

for(int i=0;i<A.length;i++)
if(A[i].length>m)
m=A[i].length;

for(int j=0;j<m;j++)
for(int i=0;i<A.length;i++)
{      
cont=0;
final=A[i][j].charAt(A[i][j].length()-1);

for(int k=i+1;k<A.length;k++)
{
final1=A[k][j].charAt(A[k][j].length()-1);

if(final==final1)
cont++;
if(cont==2)
return true;
}

              }

return false;
}
« Last Edit: 28-01-2011, 00:07:40 by salvopuglisi » Logged
ɹǝǝ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 #18 on: 28-01-2011, 02:41:36 »

Ho aggiunto i commenti su errori e con suggerimenti direttamente nel tuo codice, dopo averlo leggermente modificato affinché fosse compilabile (ti ricordo che final è una parola chiave di Java e non puoi usarla come nome di alcunché ) e un po' più leggibile  :
Code:
   public boolean metodo (String [][] A)
    {
        char final1=' ',final12=' ';
        int m=A[0].length,cont=0;
        
        for(int i=0;i<A.length;i++)
            if(A[i].length>m)
                m=A[i].length;
        
        for(int j=0;j<m;j++)
            for(int i=0;i<A.length-1;i++)   //qui puoi benissimo fermarti a i<A.length-3, risparmiando potenzialmente 2 iterazioni, di certo due confronti e 2 incrementi
            {      
                //nota: per una questione di visibilità (che va ridotta alla minima estensione necessaria) sarebbe opportuno definire cont qui, invece che all'inizio
                cont=0;
                //nota: per una questione di visibilità (che va ridotta alla minima estensione necessaria) sarebbe opportuno definire final1 qui, invece che all'inizio
                final1=A[i][j].charAt(A[i][j].length()-1);      //attenzione!!! la colonna j potrebbe non esistere nella riga i, oppure potrebbe esistere e contenere "null"!

                for(int k=i+1;k<A.length;k++)
                {
                    //nota: per una questione di visibilità (che va ridotta alla minima estensione necessaria) sarebbe opportuno definire final2 qui, invece che all'inizio
                    final12=A[k][j].charAt(A[k][j].length()-1);  //attenzione!!! la colonna j potrebbe non esistere nella riga k-esima, oppure potrebbe esistere e contenere "null"!

                    if(final1==final12)
                        cont++;
                    if(cont==2)
                        return true;
                }
            }
        return false;
        //come suggerisco sempre in questi casi, è più difficile ma insegna a creare codice meno passibile di errori (possibilmente runtine!) avere un unico punto di ritorno nelle funzioni, quando possibile
        //si potrebbe sfruttare la solita variabile booleana "found" che ci fa uscire dai cicli quando la condizione che verifica il problema è stata trovata :)
    }
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
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #19 on: 28-01-2011, 15:49:26 »

Grazieee reversengineer....Anche ogni piccolo errore può servire x migliorare dp....Grazie x i consigli e le correzioni 
Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #20 on: 28-01-2011, 16:43:06 »

Approfitto sempre di questo post per proporre un altro esercizio sugli array frastagliati:

Code:
Scrivere un metodo che prenda in input un array bidimensionale frastagliato  A di stringhe,  e
restituisca un boolean che indichi se esitono due righe compatibili in A. Due righe r1 ed r2 si dicono
compatibili se esiste una stringa in r1 e contemporaneamente la sua inversa in r2.

Ragazzi è da un sacco di minuti che cerco di capire come fare questo esercizio , c'è qualcuno che potrebbe aiutarmi anche dicendomi solo quello che dovrei fare? GRAZIE 
Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #21 on: 28-01-2011, 16:51:12 »

prova così:controlla una stringa con tutte le altre e vedi se sono l'una l'inversa dell'altra. come lo fai? intanto per essere tali devono avere stessa lunghezza: di certo abc non può essere l'inverso di dcba, ma di cba. assicurato ciò, fai il controllo se sono uguali il primo carattere della prima stringa e l'ultimo dell'altra e così via fino a controllare l'ultimo della prima con il primo dell'altra stringa. ovviamente appena una di queste uguaglianze non risulta vera nn continuare a controllare queste due stringhe ma vai avanti.
Logged

"Che la Forza sia con Te"
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #22 on: 29-01-2011, 04:09:08 »

Ma vorrei capire se il numero di colonna della stringa inversa deve essere anch'esso uguale al numero di colonna della stringa normale...Cioè non è importante in quale riga si trovi ma l'importante che una stringa abbiamo sotto di se (sempre stessa colonna ) la sua inversa giusto?  

cioè: 

ab   cd  ef 
ba   dc  fe
« Last Edit: 29-01-2011, 05:14:57 by salvopuglisi » Logged
ɹǝǝ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 #23 on: 29-01-2011, 04:54:30 »

Le due righe devono essere diverse;
le due colonne non sono specificate, quindi non devi fare alcun controllo sulle colonne (va bene sia che sia la stessa sia che siano due diverse).
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
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #24 on: 29-01-2011, 05:21:25 »

Code:

/*Scrivere un metodo che prenda in input un array bidimensionale frastagliato  A di stringhe,  e
restituisca un boolean che indichi se esitono due righe compatibili in A. Due righe r1 ed r2 si dicono
compatibili se esiste una stringa in r1 e contemporaneamente la sua inversa in r2.*/

public boolean metodo (String [][] A)
{
int cont=0,cont1=0,dim=0;

for(int i=0;i<A.length;i++)
for(int j=0;j<A[i].length;j++)
for(int k=i+1;k<A.length;k++)
           for(int x=0;x<A[k].length;x++)
if(A[i][j].length() == A[k][x].length() )
{
cont=0;dim=0;
for(int z=0;z<A[i][j].length();z++)
{
dim=A[i][j].length()-1;
if(A[i][j].charAt(z) == A[k][x].charAt(dim))
{
cont++;
if(cont==A[i][j].length()-1)
{
cont1++;
if(cont1==A.length)
return true;
}
}
dim--;
}
}
return false;
}


ho implementato l'esercizio gestendo questa situazione :

ab cd ef     -----   e ------   ab cd ef
ba dc fe     -----   e ------   dc ba fe

e NON solo questa situazione :

ab cd ef
ba dc fe



Spero di non avere combinato un disastro  
« Last Edit: 29-01-2011, 12:58:14 by salvopuglisi » Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #25 on: 29-01-2011, 15:14:04 »

poteva esprimere la richiesta semplicemente chiedendo se in una matrice sono presenti una stringa e la sua inversa in una riga diversa da quella della prima xD
a parte questo, nn cambi il valore di dim perchè quando inizia il ciclo è uguale a A[i ][j].length()-1 e quando finisce lo abbassi di 1 ma in realtà quando ricomincia il ciclo gli assegni di nuovo il valore precedente. quindi,a parte il fatto che confonde un pò le idee, invece di incasinarti con tutti quei contatori puoi usare questo metodo:
if(A[i ][j].charAt(z) == A[k]
  • .charAt(A[i ][j].length()-1-z))
così adoperi il solo indice z per controllare entrambe le parole. quindi sicuramente nn da l'effetto sperato dato che dim nn si aggiorna. un consiglio che ti posso dare è invece quello di nn fare un controllo sull'uguaglianza e quindi aumentare un contatore ma vedere se sono diversi, xkè se sn diversi si esce fuori e nn continui a fare iterazioni inutili, mentre se nn ne esce mai vuol dire che, mettendo un controllo opportuno, hai trovato la stringa inversa.
Logged

"Che la Forza sia con Te"
ɹǝǝ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 #26 on: 29-01-2011, 15:47:18 »

if(A[i ][j].charAt(z) == A[k]
  • .charAt(A[i ][j].length()-1-z))
Il forum ha convertito [x] nel quadratino piccolo boh;

un consiglio che ti posso dare è invece quello di nn fare un controllo sull'uguaglianza e quindi aumentare un contatore ma vedere se sono diversi, xkè se sn diversi si esce fuori e nn continui a fare iterazioni inutili
E... non sono d'accordo nono. Anche se non ho guardato l'implementazione nei sorgenti della JVM, presumibilmente la complessità computazionale di String.equals è O\({n}\), quindi anche se a livello asintotico usarla o controllare la lunghezza è probabilmente uguale, controllare solo la lunghezza (che, sempre presumibilmente, non viene calcolata ad ogni singola invocazione del metodo) è più ottimizzato (cioè nei casi reali, c'è la reale possibilità che la costante moiltiplicativa sia più piccola).
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
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #27 on: 29-01-2011, 18:46:19 »

Grazie per i consigli ragazzi  !!!   
Logged
Jack&Daxter
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 398



« Reply #28 on: 29-01-2011, 18:49:41 »

Ragazzi non riesco a capire dove si trova l'errore, potreste darmi una mano ? GRAZIE  

Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata A di stringhe
 e restituisca una matrice A1 copia di A in cui in ogni stringa della colonna j-esima
 ogni occorrenza del carattere ‘g’ è sostituita da un carattere ‘*’.*/

public String metodo (String [][] A)
{
String [][] A1 = new String [A.length][];
int max=A[0].length;


for(int i=0;i<A.length;i++)
if(A[i].length>max)
max=A[i].length;


for(int j=0;j<max;j++)
for(int i=0;i<A.length;i++)
{
A1[i][j]="";
for(int k=0;k<A[i][j].length();k++)
{
A1[i][j]+=A[i][j].charAt(k);

if(A1[i][j].charAt(k) == 'g')
A1[i][j].charAt(k) = '*';
}
}

return A1;
}

Logged
StephCT
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #29 on: 29-01-2011, 19:20:43 »

if(A[i ][j].charAt(z) == A[k]
  • .charAt(A[i ][j].length()-1-z))
Il forum ha convertito [x] nel quadratino piccolo boh;

un consiglio che ti posso dare è invece quello di nn fare un controllo sull'uguaglianza e quindi aumentare un contatore ma vedere se sono diversi, xkè se sn diversi si esce fuori e nn continui a fare iterazioni inutili
E... non sono d'accordo nono. Anche se non ho guardato l'implementazione nei sorgenti della JVM, presumibilmente la complessità computazionale di String.equals è O\({n}\), quindi anche se a livello asintotico usarla o controllare la lunghezza è probabilmente uguale, controllare solo la lunghezza (che, sempre presumibilmente, non viene calcolata ad ogni singola invocazione del metodo) è più ottimizzato (cioè nei casi reali, c'è la reale possibilità che la costante moiltiplicativa sia più piccola).


 yoh
cavolo per la mia testa è più veloce il contrario xD cmq ok ne terrò conto 

salvo dato che la richiesta parla di colonna j-esima, nn è ke dice che in input c'è pure un numero j, che indica appunto la colonna da controllare? perchè se così nn fosse io interpreto la cosa semplicemente nel trovare tutte le g dell'array e cambiarle con gli asterischi.
prima questo e poi lo aggiustiamo che ho già trovato una mancanza grave...ti manca la creazione della seconda dimensione...semplificando molto i termini xD
Logged

"Che la Forza sia con Te"
Pages: 1 [2] 3   Go Up
Print
Jump to: