PDA

View Full Version : [JAVA] - Matrici


FrankieB76
10-11-2011, 10:36
buongiorno, ho un problema con una matrice, non capisco quale sia l'errore, se di sintassi o di concetto. :help:

nel momento in cui vado a definire l'oggetto matrice, di arraylist di stringhe, ed il suo costruttore vuoto, ho questa situazione:


public class MatriceArchi {

public int dim;
public ArrayList <String> [][] mat;

//costruttore vuoto
public MatriceArchi () {

dim = 0;
mat = new ArrayList <String> [][];

}

}


mi segna errore sull'ultima riga,


mat = new ArrayList <String> [][];


ovvero mi dice "Cannot create a generic array of ArrayList<String>",

ma non mi dice niente sopra, quando definisco


public ArrayList <String> [][] mat;


in cosa sbaglio?
per chiarezza, l'obiettivo è la definizione di un oggetto matrice ( [] [] ) in cui ogni cella continene un ArrayList di stringhe.

grazie per l'attenzione, buona giornata! :)

VICIUS
10-11-2011, 11:51
In java non si possono creare array di generics.

FrankieB76
10-11-2011, 12:01
cioè, in parole povere, non posso mettere in un array quello che voglio?
e quale potrebbe essere l'alternativa per quello che devo fare?

Don[ITA]
10-11-2011, 12:42
In verità si possono creare:

public static <T extends Object> T[][] emptyMatrix(Class<? extends Object> of, int row, int col) {
T[][] matrix = (T[][]) java.lang.reflect.Array.newInstance(of, row, col);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
try { matrix[i][j] = (T)of.newInstance(); }
catch (InstantiationException ex) { System.err.println(ex); }
catch (IllegalAccessException ex) { System.err.println(ex); }
return matrix;
}


int W = 10, H = 10;
ArrayList<String>[][] data = emptyMatrix(ArrayList.class, W, H);

FrankieB76
10-11-2011, 12:56
;36323445']In verità si possono creare:

public static <T extends Object> T[][] emptyMatrix(Class<? extends Object> of, int row, int col) {
T[][] matrix = (T[][]) java.lang.reflect.Array.newInstance(of, row, col);
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
try { matrix[i][j] = (T)of.newInstance(); }
catch (InstantiationException ex) { System.err.println(ex); }
catch (IllegalAccessException ex) { System.err.println(ex); }
return matrix;
}


int W = 10, H = 10;
ArrayList<String>[][] data = emptyMatrix(ArrayList.class, W, H);


ehm... ti ringrazio della risposta, devo solo un attimo capire riga per riga di cosa si tratta esattamente e come posso utilizzarla per i miei scopi. :)

se non ho capito male, nel doppio ciclo di for me la sta inizializzando?

Don[ITA]
10-11-2011, 13:42
Esatto, nel doppio ciclo for inizializza la matrice. Ovviamente nulla ti vieta di farlo al di fuori di quel metodo:

int W = 10, H = 10;
ArrayList<String>[][] data = (ArrayList[][]) java.lang.reflect.Array.newInstance(ArrayList.class, W, H);
for(int x = 0; x < W; x++)
for(int y = 0; y < H; y++)
data[x][y] = new ArrayList<String>(); //ArrayList va creato proma di poter essere usato
data[0][2].add("cane");
data[0][2].add("gatto");
data[5][3].add("casa");
data[5][3].add("ufficio");
System.out.println(data[0][2]); //stampa [cane, gatto]
System.out.println(data[5][3]); //stampa [casa, ufficio]

FrankieB76
10-11-2011, 14:26
ok, grazie mille, sembrerebbe perfetto per quello che ci devo fare! :)