View Full Version : [Java] Esercizio con liste
Ciao a tutti, qualcuno saprebbe risolvere questo esercizio?
Scrivere il codice di una funzione statica java che permetta di copiare una matrice di generici oggetti in un vettore di liste. Il vettore di liste dovrà essere creato all'interno della funzione e restituito dalla funzione stessa. La lista generica i-esima del vettore di liste dovrà contenere tutti gli elementi della i-esima riga della matrice.
poi ne avrei anche un altro in cui si deve scrivere una funzione per gestire una lista... insomma ho un problemino con queste liste!! :muro:
wingman87
29-04-2009, 13:08
http://www.hwupgrade.it/forum/showthread.php?t=1631648
Spiega cosa non ti e' chiaro e inizia a scrivere qualcosa.
si scusami, hai ragione...
intanto il mio problema in questo esercizio sta nel creare diverse liste quante sono le righe della matrice. come si può fare?
edit:
ho fatto la prova anche con una sola riga ma mi dà errore...
public class MatriceLista {
Nodo n;
MatriceLista Lista = new MatriceLista();
public MatriceLista() {
n = null;
}
public void add(Object v) {
Nodo nuovo = new Nodo(v, n);
n = nuovo;
}
public Object get() {
Object rk = n.valore;
n = n.next;
return rk;
}
public void crea() {
int n = 2;
Object matrice[][] = new Object[n][n];
for (int k = 0; k < matrice.length; k++) {
int j = 0;
Lista.add(matrice[j][k]);
}
}
public void stampa() {
while (n != null)
System.out.println(Lista.get());
}
public static void main(String[] args) {
MatriceLista obj = new MatriceLista();
obj.crea();
obj.stampa();
}
mi dice Exception in thread "main" java.lang.StackOverflowError
wingman87
12-05-2009, 14:48
Penso che tu abbia inquadrato male il problema, proviamo con un esempio:
Abbiamo una matrice fatta così:
[1][2][3]
[4][5][6]
[7][8][9]
Scusa la poca fantasia per i numeri.
Passata la matrice al metodo statico che dovresti implementare il risultato sarà un vettore:
[L0][L1][L2]
L0, L1 ed L2 sono delle liste così composte:
[L0]->1->2->3
[L1]->4->5->6
[L2]->7->8->9
Con dei generici oggetti invece di numeri il concetto non cambia.
Penso che tu abbia inquadrato male il problema, proviamo con un esempio:
Abbiamo una matrice fatta così:
[1][2][3]
[4][5][6]
[7][8][9]
Scusa la poca fantasia per i numeri.
Passata la matrice al metodo statico che dovresti implementare il risultato sarà un vettore:
[L0][L1][L2]
L0, L1 ed L2 sono delle liste così composte:
[L0]->1->2->3
[L1]->4->5->6
[L2]->7->8->9
Con dei generici oggetti invece di numeri il concetto non cambia.
si si, l'esercizio l'avevo capito...
però, proprio come hai visto tu, ad ogni riga corrisponde una lista (che a loro volta faranno parte di un vettore..),
ma come faccio a creare n liste (n = numero di righe) nelle quali poi inserire gli oggetti della matrice?
non lo so a priori quante righe saranno, e anche se lo sapessi, metti che la matrice è 10x10 non è che posso creare 10 liste ad una ad una...
wingman87
12-05-2009, 15:04
si si, l'esercizio l'avevo capito...
Ah ok, scusa
però, proprio come hai visto tu, ad ogni riga corrisponde una lista (che a loro volta faranno parte di un vettore..),
ma come faccio a creare n liste (n = numero di righe) nelle quali poi inserire gli oggetti della matrice?
Fai una cosa del tipo:
LinkedList<E> vettListe=new LinkedList<E>[matrice.length];
for(int i=0;i<vettListe.length;i++) vettListe[i]=new LinkedList<E>();
Non sono solo sicuro che la sintassi di quella parte che ho messo in grassetto sia corretta.
non lo so a priori quante righe saranno, e anche se lo sapessi, metti che la matrice è 10x10 non è che posso creare 10 liste ad una ad una...
Invece è proprio quello che devi fare. Come vedi non è molto difficile, sono due righe di codice.
Invece è proprio quello che devi fare. Come vedi non è molto difficile, sono due righe di codice.
cercavo proprio un modo per crearla con un paio di righe di codice, solo che non sapevo come fare..
io intendevo che non le volevo creare una ad una facendo:
MatriceLista Lista1 = new MatriceLista();
MatriceLista Lista2 = new MatriceLista();
.
.
MatriceLista ListaN = new MatriceLista();
:p
Fai una cosa del tipo:
LinkedList<E> vettListe=new LinkedList<E>[matrice.length];
for(int i=0;i<vettListe.length;i++) vettListe[i]=new LinkedList<E>();
Non sono solo sicuro che la sintassi di quella parte che ho messo in grassetto sia corretta.
ora vedo se funziona così. intanto grazie :)
ormai tanto per concludere la pagina ecco il programma finito (per funzionare funziona, però se c'è qualcosa che non va fatemi sapere):
public class MatriceLista {
static Object matrice[][] = {{1,2,3},{4,5,6},{7,8,9},{2,6,8}};
static LinkedList<Object> vettListe[] = new LinkedList[matrice.length];
public void crea() {
for (int i = 0; i < vettListe.length; i++)
vettListe[i] = new LinkedList<Object>();
// System.out.println(vettListe.length);
for (int k=0; k<matrice.length; k++){
for (int j=0; j<matrice[0].length; j++){
vettListe[k].add(j, matrice[k][j]);
}
}
}
public void stampa() {
for (int i=0; i<matrice.length; i++) System.out.println(vettListe[i]);
}
public static void main(String[] args) {
MatriceLista obj = new MatriceLista();
obj.crea();
obj.stampa();
}
}
grazie wingman87!!! :D
PS: effettivamente avevi ragione, cioè non è che non avevo capito il testo, ma non sapevo come funzionavano le LinkedList, quindi io volevo fare delle semplici liste (infatti c'era la parte inutile dove definivo i nodi ecc che ora non serve più..) e poi "collegarle" in qualche modo in un vettore... quindi non sapevo come fare per crearne n diverse con un ciclo for!!
PPS: ho visto che l'avrei potuto fare lo stesso con l'ArrayList che avevo visto, ma che non sapevo lo stesso come funzionasse... :stordita:
wingman87
12-05-2009, 16:51
Sono contento che hai risolto, però c'è ancora qualcosa che non va: il testo dell'esercizio richiede che il lavoro sia svolto da una funzione statica che prende in input la matrice e che restituisce il vettore di liste, inoltre sfruttando i generici potresti evitare di usare sempre Object. Quindi in pratica il main sarà una cosa tipo:
public static void main(String[] args){
Integer matrice[][] = {{1,2,3},{4,5,6},{7,8,9},{2,6,8}};
LinkedList vettListe[]=creaVettListe(matrice);
//Qui poi puoi mettere la stampa dei valori per controllare che funzioni
}
e il metodo avrà un'intestazione di questo tipo:
public static <E> LinkedList<E> creaVettListe(E[][] matrice)
Spero di non aver fatto confusione con i generici.
Sono contento che hai risolto, però c'è ancora qualcosa che non va: il testo dell'esercizio richiede che il lavoro sia svolto da una funzione statica che prende in input la matrice e che restituisce il vettore di liste, inoltre sfruttando i generici potresti evitare di usare sempre Object. Quindi in pratica il main sarà una cosa tipo:
public static void main(String[] args){
Integer matrice[][] = {{1,2,3},{4,5,6},{7,8,9},{2,6,8}};
LinkedList vettListe[]=creaVettListe(matrice);
//Qui poi puoi mettere la stampa dei valori per controllare che funzioni
}
e il metodo avrà un'intestazione di questo tipo:
public static <E> LinkedList<E> creaVettListe(E[][] matrice)
Spero di non aver fatto confusione con i generici.
mmm... mettendo queste righe che hai scritto tu... sballano un pò di cose e non riesco più a farlo funzionare... :muro:
wingman87
12-05-2009, 17:14
Beh sì, devi modificare quasi tutto e tenere solo la logica del metodo. Devi fare solo un lavoro di riorganizzazione.
Beh sì, devi modificare quasi tutto e tenere solo la logica del metodo. Devi fare solo un lavoro di riorganizzazione.
ora devo andare, casomai stasera o domani vedo di riorganizzare un pò tutto..
comunque grazie 1000!! ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.