PDA

View Full Version : [Java] problema con array


gigippa
15-11-2007, 16:56
Ciao a tutti. Devo implementare un metodo
public static int[] creaVett(int[] a, int[] b)
che riceva in ingresso due array di numeri interi a e b e restituisca un array di interi. L’array di ouput contiene gli elementi che compaiono in a ma non in b, ad es.:
a: 1 | 2 | 3 | 5 | 6 | 5; b: 2 | 6 | 4 output: 1 | 3 | 5 | 5
Io ho provato così ma non mi funziona. chi mi aiuta? grazie
public static int[] creaVett(int[] a, int[] b){

int j = 0;
int k = 0;
int[] d = new int[a.length];

for(int i = 0; i < a.length; i++){
while(j<b.length){
if(a[i]!=b[j]){
d[k]=a[i];
k++;
}
j++;
}
}
return d;
}

andbin
15-11-2007, 17:17
Per ogni elemento nell'array 'a' devi scansionare l'array 'b' per vedere se esiste. Se lo trovi sai già subito che non dovrai metterlo nell'array di output. Se non c'è lo sai solo alla fine della scansione di 'b'! Questo vuol dire che solo quando avrai finito di scansionare l'array 'b' allora saprai che l'elemento deve essere inserito nell'array di output.

Il concetto è ben diverso da quello che hai implementato tu.

gigippa
15-11-2007, 17:41
Per ogni elemento nell'array 'a' devi scansionare l'array 'b' per vedere se esiste. Se lo trovi sai già subito che non dovrai metterlo nell'array di output. Se non c'è lo sai solo alla fine della scansione di 'b'! Questo vuol dire che solo quando avrai finito di scansionare l'array 'b' allora saprai che l'elemento deve essere inserito nell'array di output.

Il concetto è ben diverso da quello che hai implementato tu.
Ok... ci lavoro su. Grazie

gigippa
15-11-2007, 18:01
Questa come ti sembra?
public static int[] creaVett(int[] a, int[] b){

int j = 0;
int k = 0;
//int i = 0;
int[] d = new int[a.length];

for(int i = 0; i < a.length; i++){
while(j<b.length){
if(a[i]==b[j]){
j++;
}
else{
d[k]=a[i];
k++;
}
}
}//for
return d;


}
Se puoi per favore aiutami ancora

andbin
15-11-2007, 18:07
Questa come ti sembra?A occhio direi che non è ancora corretto. Solo alla fine della scansione (se non hai trovato l'elemento) sai che devi inserire l'elemento nell'array di output.

Se trovi che a[i] != b[j] non vuol dire che devi subito inserire l'elemento. Perché l'elemento successivo in 'b' potrebbe corrispondere.

Per dirla ancora in altri termini: se in 'b' trovi l'elemento, devi terminare subito la scansione di 'b' e sai che non devi inserire l'elemento. Altrimenti devi andare avanti e solo alla fine della scansione di 'b' sai che l'elemento va aggiunto.

gigippa
15-11-2007, 18:14
Per dirla ancora in altri termini: se in 'b' trovi l'elemento, devi terminare subito la scansione di 'b' e sai che non devi inserire l'elemento. Altrimenti devi andare avanti e solo alla fine della scansione di 'b' sai che l'elemento va aggiunto.
Ok. Ma come posso "dirlo" in java?

andbin
15-11-2007, 20:34
Ok. Ma come posso "dirlo" in java?Potresti tenere un "flag". Prima di iniziare il ciclo su 'b' metti questo flag (va bene un boolean, ad esempio) in modo da indicare la condizione di "non trovato". Appena trovi una corrispondenza, setti il flag in modo da indicare la condizione di "trovato" ed esci dal ciclo.
Dopo il ciclo testi il flag e se indica "non trovato", allora aggiungi l'elemento.

Esiste anche una soluzione più furba che evita l'utilizzo di una variabile di flag. Si tratta di sfruttare la istruzione di continue con label (etichetta).