Pages: [1]   Go Down
Print
Author Topic: Un errore al momento di esecuzione  (Read 1275 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« on: 31-03-2009, 21:03:03 »

in questo esercizio mi dà un errore alla riga 21, praticamente è l'esercizio in cui il metodo prende come parametro una matrice di stringhe, e deve restituire un'altra matrice con le stringhe private dei primi due e ultimi due caratteri:
Non so come fare per quanto riguarda le dimensioni, le matrici sono frastagliate, non so come fare all'interno del metodo a specificare le dimensioni, mi date una mano?
Al di là dei problemi del main, il metodo è corretto? fa quello che dico io??
Ecco il codice.

Code:
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata S di stringhe e
restituisca una matrice S’ ottenuta da S eliminando i primi due e gli ultimi due caratteri di ogni
stringa.*/

class Ex13
{
public static void main(String []args)
{

String [][] S={{"ciao","mamma"},
    {"guarda","come"},
    {"mi","diverto"}};
  System.out.println(prendistringhe(S));
}



public static String[][] prendistringhe(String[][] S)
{
int n=S.length;
int m=S[n].length;
S=new String[n][m];
String [][] S1=new String[n][m];
for(int r=0; r<S.length; r++)
{
for(int k=0; k<S[r].length; k++)
{
String p="";
S1=new String[S.length][S[r].length];
S1[r][k]=p;
p+=S[r][k].substring(2,S[r][k].length()-2);
}

}
return S1;
}

}
« Last Edit: 31-03-2009, 21:23:26 by guitarplaying » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #1 on: 31-03-2009, 22:06:45 »

ke numero è l'esercizio nella lista?
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 31-03-2009, 22:19:55 »

E' il numero 13.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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 #3 on: 31-03-2009, 22:36:08 »

Quote
/*Scrivere un metodo che prenda in input una matrice bidimensionale frastagliata S di stringhe e
restituisca una matrice S’ ottenuta da S eliminando i primi due e gli ultimi due caratteri di ogni
stringa.*/
Ecco i tuoi errori:
Code:
int m=S[n].length;
Per come hai calcolato n, non esista l'elemento S[n] e di conseguenza sarà lanciata una java.lang.ArrayIndexOutOfBoundException

Code:
S=new String[n][m];
Qui stai sovrascrivendo il valore di S riassegnandolo con un riferimento a nuovo array bidimensionale. In pratica perdi il modo di leggere l'input passato .

Code:
S1=new String[S.length][S[r].length];
Altro errore di sovrascrittura, stavolta di S1, tra l'altro che fa perdere tutto il lavoro creato con i precedenti cicli e la precedente inizializzazione (v. riga successova a quella dell'errore appena descritto al punto precedente)

Code:
S1[r][k]=p;
p+=S[r][k].substring(2,S[r][k].length()-2);
Uso completamente sbagliato dell'assegnazione. Se anche gli errori dei punti precedenti venissero corretti, questo tipo di assegnazione, che si propone (nelle intenzioni di chi scrive il programma) di assegnare a S1[k][k] una stringa costruita per concatenazione, in realtà fa le seguenti cose:
1) Assegna a S1[r][k] una stringa vuota creata una riga sopra (p), la stessa stringa sarà puntata da due riferimenti a oggetti di tipo String;
2) Esegue un codice equivalente a:
Code:
p = p + S[r][k].substring(2,S[r][k].length()-2);
Che prende il valore della prima stringa p (una stringa vuota cioè), prende una seconda stringa (create come nuovo oggetto rispetto a S[r][k], ottenuta come sottostringa appunto di S[r][k], viene fatta la concatenazione creando una nuova stringa unendo questi due "valori" e poi il riferimento a tale nuova stringa viene salvato in p, tuttavia S1[r][k] continua a puntare a una stringa vuota (creata precedentemente) in memoria. Quindi la modifica si perde poiché resta memorizzata solo in p;

Mi sento di postare una soluzione elegante a questo esercizio (solo il metodo):
Code:
public static String [][] metodo (String [][] S)
{
    String [][] R = new String [S.length][];
   
    for (int i = 0; i < S.length; i++)
    {
        R [i] = new String [S [i].length];
       
        for (int j = 0; j < S [i].length; j++)
            R [i][j] = S [i][j].substring (2, S [i][j].length () - 2);
    }
   
    return R;
}
Saluti  .
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
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 on: 31-03-2009, 22:43:32 »

Grazie mille, domani mattina mi alzerò e proverò a correggere, ora proprio non ce la faccio proprio, troppo stanco...
Comunque ti ringrazio tanto, sarei curioso davvero di capire chi sei... 
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #5 on: 01-04-2009, 18:10:51 »

Grazie reverse, però se ti colleghi di nuovo ti prego di chiarirmi la tua soluzione elegante perchè non ho capito come fai, cioè il funzionamento con la substring si, però quello che c'è prima no, non capisco come fai a fare in modo che la matrice che deve essere restituita abbia le stesse dimensioni di quella presa dal metodo, mi spieghi passo passo cosa fai??' grazie.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝ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 #6 on: 01-04-2009, 23:05:11 »

Grazie reverse, però se ti colleghi di nuovo ti prego di chiarirmi la tua soluzione elegante perchè non ho capito come fai, cioè il funzionamento con la substring si, però quello che c'è prima no, non capisco come fai a fare in modo che la matrice che deve essere restituita abbia le stesse dimensioni di quella presa dal metodo, mi spieghi passo passo cosa fai??' grazie.

Mannaggia alla nomenclatura. E non è colpa tua.
Allora una volta per tutte (magari poi farò un post a proposito) per chiarire definitivamente quale sia la nomenclatura corretta da adottare:
- una matrice non può essere frastagliata, poiché si riferisce ad un oggetto informatico che ha le stesse caratteristiche dell'omonimo oggetto matematico
- un array di array può tranquillamente essere frastagliato
- gli array di array di array {ecc... dove la parola "array" è ripetuta n-volte} è detto alternativamente ed equivalentemente "array n-dimensionato" o anche "array di dimensione n".

Detto ciò, ecco il codice di prima opportunamente commentato:
Code:
public static String [][] metodo (String [][] S)
{
    //consideriamo che un array bidimensionale è un array i cui elementi sono a loro volta degli array
    //per prima cosa definisco un riferimento (R) a un array di array di Stringhe (String [][] R)
    //a cui assegno (poiché è un array di array) un array che contiene come elementi esattamente
    //(S.length) array di stringhe
    String [][] R = new String [S.length][];
   
    //per ogni riga dell'input
    for (int i = 0; i < S.length; i++)
    {
        //notare che i vari R [i] sono a loro volta riferimenti ad array di stringhe, attualmente posti tutti a null
        //quindi inizializzo i vari R [i] con un'array di stringhe di lunghezza "S[i].length"
        R [i] = new String [S [i].length];
       
        //per ogni sinngola stringa dell'array S [i] (preso dall'input)
        for (int j = 0; j < S [i].length; j++)
            //assegno al riferimento stringa di posto (i, j)
            //cioè riga i e colonna j, l'istanza di nuova stringa
            //(ricordiamoci che "substring" crea nuove stringhe
            //ottenute come sottostringhe dell'oggetto su cui è invocato)
            //che è la sottostringa dell'input S [i][j] a cui
            //mancano i primi due e ultimi due caratteri
            R [i][j] = S [i][j].substring (2, S [i][j].length () - 2);
    }
   
    //infine restituisco il nuovo array di array di stringhe (anch'esse nuove di zecca) appena creato e riempito
    return R;
}
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 #7 on: 01-04-2009, 23:36:34 »

guitarplaying mi sa che per dare questa materia  ti conviene farti adottare da reverse  [Emoticon] Asd
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
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #8 on: 02-04-2009, 12:40:17 »

adottatemi pure a me girl
Logged

Pages: [1]   Go Up
Print
Jump to: