Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Jack&Daxter on 19-01-2011, 19:04:17



Title: Dubbio su array frastagliati
Post by: Jack&Daxter on 19-01-2011, 19:04:17
/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che indichi
se esistono due colonne di A le cui rispettive medie dei valori coincidono. Non si possono usare
array ausiliari.
*/

 int somma=0,somma1=0,media,media1;


      for(j=0;j<A[0].length;j++)
      {
                somma=0;
            for(i=0;i<A.length;i++)
            {
               somma+=A[i ][j];
            }
          media= somma/A.length;
            
         for(int j1=j+1;j1<A[0].length;j1++)
            {
                somma1=0;
               for(int i1=0;i1<A.length;i1++)
               {
                  somma1+=A[i1][j1];
               }
                media1=somma1/A.length;
               
               if(media==media1)
                  trovato=true;
            }
      }
            
            
System.out.print(trovato);

Ho scritto questo codice (provato-funzionante)  senza utilizzare gli array frastagliati....
Ma se dovessi fare questo esercizio con array frastagliati come verrebbe? GRAZIE


Title: Re:Dubbio su array frastagliati
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-01-2011, 19:29:26
Il prof. è stato abbastanza chiaro dicendo che il metodo "prende in input una matrice", di conseguenza non esiste il problema del frastagliamento... per definizione (matematica) di matrice .sisi.

Se poi, al di là della consegna, vuoi comunque sapere come comportarti in tal caso, possiamo riparlarne .smile.


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 19-01-2011, 21:47:52
Capito capito  .wink  ... Però sarai curioso di capire come verrebbe il precedente algoritmo se utilizzassi l'array frastagliato ! .smile


Title: Re:Dubbio su array frastagliati
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-01-2011, 23:56:08
C'è molta roba in questo forum riguardo gli array frastagliati e come scandagliarne le colonne in sicurezza.

Non è impossibile, bisogna ragionarci un pochino.
Tuttavia, ripeto, una ricerca in questo forum ti darà risultati comunque utili alla comprensione (anche con messaggi miei).
 .ciaociao


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 25-01-2011, 12:48:12
dato che siamo in un topic dal titolo appropriato riuppo questo per chiedere un consiglio: negli array frastagliati spesso è richiesto di controllare se la somma di due colonne uguali e simili. mi chiedevo: è consigliabile fare prima un ciclo for per trovare la riga che ha la lunghezza più lunga e poi impostare il primo for con l'indice di colonna che va da 0 a questo max?

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

ad esempio in questo caso bisogna controllare le colonne quindi sarebbe in teoria necessario, come si fa nelle matrici, scrivere prima il for della "j", indice di colonna, e poi quello dell'indice "i" di riga...


Title: Re:Dubbio su array frastagliati
Post by: Stardust on 25-01-2011, 13:30:37
dato che siamo in un topic dal titolo appropriato riuppo questo per chiedere un consiglio: negli array frastagliati spesso è richiesto di controllare se la somma di due colonne uguali e simili. mi chiedevo: è consigliabile fare prima un ciclo for per trovare la riga che ha la lunghezza più lunga e poi impostare il primo for con l'indice di colonna che va da 0 a questo max?

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

ad esempio in questo caso bisogna controllare le colonne quindi sarebbe in teoria necessario, come si fa nelle matrici, scrivere prima il for della "j", indice di colonna, e poi quello dell'indice "i" di riga...

Devi solo scandire ma la matrice frastagliata per colonne in qst esercizio e fare qll che dice..


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 25-01-2011, 14:09:39
giustissimo, ma come fai a dare un limite al ciclo delle colonne? perchè se si fa nel solito modo:
for(j=0;j<A[0].length;j++)
  for(i=0;i<A.length;i++)
rischi di mangiarti alcune colonne perchè magari la prima riga nn è la più lunga. di conseguenza chiedevo: è necessario fare prima un ciclo per trovare la lunghezza max e quindi diciamo impostare quel j da 0 a j<max, oppure ci sn altri metodi?


Title: Re:Dubbio su array frastagliati
Post by: Stardust on 25-01-2011, 14:30:00
giustissimo, ma come fai a dare un limite al ciclo delle colonne? perchè se si fa nel solito modo:
for(j=0;j<A[0].length;j++)
  for(i=0;i<A.length;i++)
rischi di mangiarti alcune colonne perchè magari la prima riga nn è la più lunga. di conseguenza chiedevo: è necessario fare prima un ciclo per trovare la lunghezza max e quindi diciamo impostare quel j da 0 a j<max, oppure ci sn altri metodi?
MMmmm.... forse si dovresti trovarti la riga più lunga e poi devi stare attendo che esista la colonna che cerchi infatti può capitare che cerchi qualcosa che nn c'è generando un eccezione quindi a quanto pare i cicli fino ad ora sn 3 cmq ma intanto scrivi il codice se da errore lo correggiamo!  :[Emoticon] PC Asd:


Title: Re:Dubbio su array frastagliati
Post by: Luxandro on 25-01-2011, 16:39:17
Salve ragazzi!   .ciaociao

Svolgendo gli esercizi riguardanti gli array frastagliati ho incontrato, come StephCT, difficoltà nello "scorrere per colonne" gli array frastagliati. Dopo un po' di ragionamenti ho deciso di creare un array dim[] che memorizzi, tramite ciclo for, le dimensioni di ogni riga.
Propongo, di seguito, il codice di un esercizio. Logicamente "sembra" non ci siano errori, ma in fase di esecuzione ritorna il solito errore "ArrayIndexOutOfBoundsException". Da notare che, provando ad inserire in input una semplice matrice rettangolare, l'errore non si presenta   :boh

Spero che qualcuno possa darmi un parere in proposito.

Grazie in anticipo!  .rido

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 static boolean metodo (String [][] A)
{
int r = 0, g;
int [] dim = new int [A.length];

for (g = 0; g < A.length; g++)
            dim [g] = A[g].length;

for (g = 0; g < A.length; g++)
{
for (int j = 0; j < dim[g] ; j++)
{
for (int i = 0; i < A.length; i++)
{
if(!(A [i][j].equals(""))){
String x = "";
x = A [i][j].substring(A [i][j].length()-1);
for (int y = 1; y < A.length - 1; y++)
{
if(!(A [y][j].equals("")))
if(A [y][j].endsWith (x)) r++;
if(r == 3) return true;
}
}
}
}
}
return false;
}
}


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 25-01-2011, 19:38:33
ovvio che nn funziona, xkè il ciclo della j dipende da g, quindi se g nn si aggiorna j smette di andare avanti perchè magari una riga è più lunga di un'altra ecc mentre nelle matrici rettangolari sn tutti la stessa cosa. quindi, come ho scritto nell'altro post, bisogna fare un ciclo e memorizzare in una variabile la lunghezza massima.

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

così parti direttamente cn il ciclo della j    for(j=0;j<max;j++)
e poi stare attento a poter controllare solo se
if(j<A.length)

così i codici mi hanno sempre compilato. era questo che chiedevo prima. se è conveniente usare sto ragionamento o c'è qualcos'altro che mi evita il ciclo per cercare la lunghezza max?


Title: Re:Dubbio su array frastagliati
Post by: Luxandro on 26-01-2011, 08:10:08
Il ciclo basta farlo una volta sola? Non serve che max si aggiorni per ogni riga?   .penso
Se ho ben capito il for dovrebbe essere fatto prima che inizi l'iterazione delle colonne...quindi dovrebbe essere il ciclo più esterno... sbaglio?  :boh


EDIT: funge! Grazie mille Steph!  :-OK


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 26-01-2011, 22:18:44
Ragazzi approfitto di questo post per dirvi cosa non va in questo codice:

/*Scrivere un metodo che prenda in input un array bidimensionale S di stringhe, e restituisca un
boolean che indichi se esiste una colonna di S in cui un certo carattere occorre una volta sola */

public boolean metodo( String [][] A)
   {
      int cont=0;
      int max=A[0].length;
      boolean trovato=false;

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

      for(int j=0;j<max  &&  !trovato;j++)
         {
            cont=0;
            for(int i=0;i<A.length && !trovato;i++)
               for(int k=0;k<A[i ][j].length()-1 && !trovato;k++)
                     if(A[i ][j].charAt(k) == A[i ][j].charAt(k+1))
                     {
                        cont++; //Male che vada questo diventera 1
                        if(cont>0)
                        {
                           trovato=true;
                           return true; // Esce e restituisce true  perchè ci sono caratteri che si ripetono più di una volta
                        }
                        
                     }
         }
                  if(cont==0) // Se è 0 cont ,significa che non è mai entrato nella condizione di uguaglianza
                  return false; // Restituisce false perchè nessun carattere si ripete più di una volta
         
   }

Come errore il compilatore mi da :
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
   at java.lang.String.charAt(Unknown Source)

Spero di aver interpretato bene l'esericizio  .poverinoi...Ragazzi se qualcuno ha già fatto l'ese potrebbe darmi una mano ?? GRAZIE


Title: Re:Dubbio su array frastagliati
Post by: Stardust on 27-01-2011, 09:17:48
usa il tag code... xk sennò c'è perdita di informazione


Title: Re:Dubbio su array frastagliati
Post by: Luxandro on 27-01-2011, 11:10:13
Ciao Salvo!  .ciaociao

Per quanto riguarda il for di controllo della dimensione massima
Code:
 for(int i=0;i<A.length;i++)
         if(A[i ].length>max)
            max=A.length;
puoi anche non metterlo poichè ci troviamo in presenza di una matrice rettangolare e non frastagliata, quindi potresti scorrerla semplicemente per colonne mettendo nella condizione del for ( che scorre le colonne)

j < A[0].length

probabilmente potresti anche omettere le variabili cont e trovato poichè il metodo deve ritornare un boolean solo quando trova due stringhe della stessa colonna aventi almeno un carattere uguale.

Ti propongo di seguito una possibile soluzione all'esercizio
Code:
public static boolean metodo (String [][] S)
{
for (int j = 0; j < S[0].length; j++)
for (int i = 0; i < S.length; i++)
for (int r = i + 1; r < S.length; r++)
{
char [] v1 = S[i][j].toCharArray();    char [] v2 = S[r][j].toCharArray();
for (int k = 0; k < v1.length; k++)
for (int z = 0; z < v2.length; z++)   if (v1[k] == v2[z])   return true;
}
return false;
}
}
e la corrispondente verifica tramite main
Code:
public static void main (String [] args)
{
String [][] S = {{"abcd","ef","ghi"},{"lmi","no","pqrs"},{"t","ioo","vz"}};
for (int x = 0; x < S.length; x++)
{
for (int y = 0; y < S[x].length; y++)
System.out.print(S[x][y]+"\t");
System.out.print("\n");
}
System.out.println(metodo(S));
}


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 27-01-2011, 18:59:09
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...


Title: Re:Dubbio su array frastagliati
Post by: Luxandro 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!  .wink


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 27-01-2011, 23:59:45
Code:
Grazie ragazzi siete stati utili !!!


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter 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  .penso .. 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;
}


Title: Re:Dubbio su array frastagliati
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ 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é .nono) e un po' più leggibile  .coolio:
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 :)
    }


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter 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  .wink .arrossisco


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter 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  .wink


Title: Re:Dubbio su array frastagliati
Post by: StephCT 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.


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter 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?  .wink

cioè: 

ab   cd  ef 
ba   dc  fe


Title: Re:Dubbio su array frastagliati
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ 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).


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter 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  .penso


Title: Re:Dubbio su array frastagliati
Post by: StephCT 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.


Title: Re:Dubbio su array frastagliati
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ 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).


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 29-01-2011, 18:46:19
Grazie per i consigli ragazzi  !!!   .wink .arrossisco


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 29-01-2011, 18:49:41
Ragazzi non riesco a capire dove si trova l'errore, potreste darmi una mano ? GRAZIE  .wink

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;
}



Title: Re:Dubbio su array frastagliati
Post by: StephCT 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  .rido

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


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 30-01-2011, 09:59:45
Ok c'ho riprovato speriamo che questa volta vada meglio...Ho seguito i consigli  .wink

Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata A di stringhe ed un byte a
 e restituisca una matrice A1 copia di A in cui in ogni stringa della colonna a-esima
 ogni occorrenza del carattere ‘g’ è sostituita da un carattere ‘*’.*/
 
 public String metodo (String [][] A , byte a)
{
int max=A[0].length;
int i=0,j=0,k=0;

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

//creazione seconda dimensione
String [][] A1 = new String [A.length][];

for(i=0;i<A.length;i++)
{
A1[i]=new String [A[i].length];
for(j=0;j<A[i].length;j++)
A1[i][j]=A[i][j];
}

for(j=0;j<max;j++)
for(i=0;i<A.length;i++)
if(j==a-1)
{
A1[i][j]="";
for(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;
}


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 30-01-2011, 11:08:00
diciamo che la procedura è sostanzialmente corretta. purtroppo c'è un però xD faccio schifo lo so  :-OK
allora secondo me è una perdita di tempo riempire prima tutto l'array copia e poi andare a modificare la colonna a-esima cn un altro ciclo. diciamo che tu fai continuamente una copia ma appena l'indice j è uguale a (e non uguale ad a-1 che è sbagliato come hai scritto) allora compi l'operazione della richiesta.quindi prima cmq vorrei apportare delle piccole modifiche al tuo: superata la serie di cicli dove dici creazione seconda dimensione, inizia di nuovo la j. bene questo è inutile. puoi fare solo quello delle righe i, tanto poi devi lavorare solo sulla colonna a, ovviamente facendo attenzione col solito if(a<A[i ].length) per saltare l'elemento mancante. j in ogni caso doveva essere proprio uguale ad a e non ad a-1, poi per il resto è "corretto".
per cui io lo farei in automatico così:
Code:
public String[][] metodo(String[][] A, byte a)
{
String[][] A1=new [A.length][];
for(int i=0;i<A.length;i++)
{
A1[i]=new String[A[i].length];
for(int j=0;j<A[i].length;j++)
{
A1[i][j]="";
if(j==a)
{
for(int k=0;k<A[i][j].length();k++)
if(A[i][j].charAt(k)=='g')
A1[i][j]+='*';
else
A1[i][j]+=A[i][j].charAt(k);
}
else
A1[i][j]=A[i][j];
}
}
 return A1;
}


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 30-01-2011, 11:43:56
ok bene !! grazie per i consigli preziosi !!!  .arrossisco .wink


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 31-01-2011, 17:36:06
Scusatemi ma vorrei capire una cosa mi hanno detto ke quando si ha a che fare con array frastagliati si deve mettere la condizione if(j<A[i ].length)....ma vorrei capire dove e quando si mette...GRAZIE !!! .wink


Title: Re:Dubbio su array frastagliati
Post by: Stardust on 31-01-2011, 17:42:57
Scusatemi ma vorrei capire una cosa mi hanno detto ke quando si ha a che fare con array frastagliati si deve mettere la condizione if(j<A[i ].length)....ma vorrei capire dove e quando si mette...GRAZIE !!! .wink
Lo si usa per evitare di uscire fuori dall' matrice frastagliata ed evitare l' errore IndexOutOfBoundsException ecc ecc di solito lo usi in base a quello che devi fare... tutto quà  :[Emoticon] PC Asd:


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 31-01-2011, 18:14:10
Capito...Ma vorrei capire se quello che dico io è giusto:

La condizione if(j<A[i ].length) si usa solo nel caso in cui si inizia con il ciclo j e quindi poi va messo dentro i 2 for ?

es:

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


Title: Re:Dubbio su array frastagliati
Post by: Stardust on 31-01-2011, 18:21:56
in qst caso così è scritto bene  .camberman


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 31-01-2011, 18:24:17
Invece così anche se si ha a che fare con array frastagliati , nn ha senso quello che sto per scrivere giusto?


     for(i=0;i<A.length;i++)
         for(j=0;j<A[i ].length;j++)
                   if( j<A[i ].length)       ------->  ?


Title: Re:Dubbio su array frastagliati
Post by: StephCT on 31-01-2011, 19:00:23
certo che è inutile così, xkè tramite i due cicli sei sicuro di essere all'interno dei limiti, quindi lavori sempre con elementi esistenti


Title: Re:Dubbio su array frastagliati
Post by: Jack&Daxter on 31-01-2011, 19:47:41
ok apposto !! Grazie