View Full Version : JAVA - Matrici con Arraylist
FrankieB76
12-07-2011, 17:56
Salve a tutti, innanzi tutto! :)
scusate, ho un problema di programmazione con Java.
mi servirebbe dichiarare una matrice di ArrayList di ArrayList.... è possibile una cosa di questo tipo? mi servirebbe solo impostarla... il fatto è che la matrice iniziale so di quante righe e colonne deve essere, mentre quello che contiene ogni locazione della matrice è roba piuttosto variabile, ovvero un certo numero di vettori, ognuno di un certo numero di interi...
qualcuno avrebbe suggerimenti da darmi? grazie mille in anticipo! :)
import java.util.*;
public class Prova {
public static void main(String[] args) {
ArrayList<ArrayList> matrix = new ArrayList<ArrayList>();
ArrayList<Integer> firstRow = new ArrayList<Integer>();
firstRow.add(0, 12);
firstRow.add(1, 15);
firstRow.add(2, -2);
matrix.add(0, firstRow);
ArrayList<Integer> secondRow = new ArrayList<Integer>();
secondRow.add(0, 112);
secondRow.add(1, 56);
secondRow.add(2, 24);
secondRow.add(3, 1);
matrix.add(1, secondRow);
ArrayList<Integer> thirdRow = new ArrayList<Integer>();
thirdRow.add(0, 23);
thirdRow.add(1, 2455);
matrix.add(2, thirdRow);
for(int i = 0; i < matrix.size(); i++) {
ArrayList<Integer> row = matrix.get(i);
for(int j = 0; j < row.size(); j++)
System.out.print(row.get(j) + " ");
System.out.println();
}
}
}
12 15 -2
112 56 24 1
23 2455
FrankieB76
12-07-2011, 20:31
wow! grazie mille Ndakota!!! anche per la rapidità!
la struttura va benissimo, adesso faccio un po' di tentativi per gli inserimenti dei dati da tastiera o in lettura da file! se dovessi avere altri problemi, magari torno a chiedere consiglio!!
grazie ancora, buona serata! :)
Francesco
Probabilmente il tuo thread verrà chiuso perchè non hai rispettato la convenzione circa l'argomento del thread. Nel caso aprine un altro o scrivimi pure in privato. Ciao ;)
FrankieB76
13-07-2011, 00:51
non ho capito... che danni ho fatto? :(
Niente di che eh http://www.hwupgrade.it/forum/showthread.php?t=1649196
FrankieB76
13-07-2011, 15:45
speriamo che resti ancora un po'....
vorrei chiedere una cosa, se ho questo codice:
public ArrayList prendidati(){
//dichiaro un nuovo ArrayList
ArrayList lista = new ArrayList();
// Inizalizzo il reader di opencsv
CSVReader reader = null;
try {
//leggo il file arraylist.csv con il separatore ';'
reader = new CSVReader(new FileReader("arraylist.csv"), ';');
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String [] nextLine;
//int j = 0;
try {
while ((nextLine = reader.readNext()) != null) {
for(int i = 0; i < nextLine.length; i++)
lista.add (Double.valueOf(nextLine[i]).doubleValue());
}
} catch (IOException e) {
e.printStackTrace();
}
//prova per vedere se memorizza qualcosa (da cancellare alla fine)
System.out.println ();
for(int i = 0; i < lista.size(); i++) {
System.out.print (lista.get(i) + " ");
}
System.out.println ();
// System.out.println ("la lista è: " + lista);
return lista;
} // fine metodo prendidati
(sperando di aver azzeccato il thread per il codice... )
mi legge ed inserisce nell'Arraylist "lista" tutti i dati presenti nel file csv, composto di svariate righe a lunghezza variabile. come faccio invece a farlo fermare alla prima riga? ovviamente il risultato finale dovrà essere che riesco ad inserire ogni riga del mio .csv in un ArrayList di ArrayList, ma questa me la vedo io dopo...
che suggerimento mi potresti dare? grazie sempre in anticipo! :)
Usa un BufferedReader (http://download.oracle.com/javase/6/docs/api/java/io/BufferedReader.html)al posto di FileReader per leggere il contenuto del file, e poi passa il contenuto letto successivamente al CSVReader: in questo modo ti potrai fermare dopo aver letto la prima riga.
FrankieB76
14-07-2011, 10:50
ok, mi studio il funzionamento e ci provo!
grazie! :)
FrankieB76
23-08-2011, 18:00
salve a tutti.
continuo ad occuparmi di array e ArrayList...
ho un problema: nel momento in cui ho dei piccoli array, all'interno di un ciclo for, quindi sotto l'indice "i", nel momento in cui devo inserirle singolarmente in un Arraylist, nella i-esima posizione, come faccio?
spiego meglio, ho provato facendo:
lista.add(Integer.parseInt(str_list[i]));
str_list[i] è l'elemento dell'array dichiarato come:
String[] str_list = line.trim().split("\\s") -- (sto leggendo la riga di un file)
mentre lista è l'ArrayList, dichiarato come:
ArrayList lista = new ArrayList();
e dovrebbe essere un ArrayList di elementi che sono (vorrei che fossero...) ognuno degli array. e già mi viene il dubbio che abbia sbagliato la dichiarazione di lista.
dicevo, il problema di fare così, con la ".add", è che aggiunge nell'ArrayList ogni volta l'array a quello precedente, così in parole povere, invece di aggiungere 3 array al mio ArrayList di array, ottengo un Arraylist con dentro i tutti i singoli elementi dei 3 array, uno di fila all'altro.
mi sono spiegato bene?
non mi fa usare la lista.get(i), perche posso usarla come elemento a destra di una assegnazione con a sinistra una variabile, ma non come elemento a sinistra, che appunto deve essere una variabile...
come posso fare per ottenere un mio ArrayList di 3 elementi di tipo array (di interi, tradotti con il parseInt dalle stringhe lette dal file) ???? :muro:
grazie mille in anticipo a chiunque voglia rispondere! :help:
FrankieB76
24-08-2011, 22:10
hmmm... nessuno ha un suggerimento?
wingman87
24-08-2011, 23:38
Se la lista che vuoi dichiarare deve essere una lista di liste di stringhe, usando ArrayList puoi dichiararla così:
ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
Per inserire un elemento nella lista di indice i ne ottieni prima il riferimento e poi la usi normalmente:
String elementToAdd = "stringa da inserire";
ArrayList<String> innerList = list.get(i);
innerlist.add(elementToAdd);
Per ottenere la lista i però essa deve essere già presente in list, altrimenti otterrai un'eccezione. Se sai già il numero di liste che devono essere contenute in list puoi inizializzarle così:
for(int i = 0; i < numInnerLists; i++)
{
list.add(new ArrayList<String>());
}
FrankieB76
25-08-2011, 09:41
ciao wingman87, grazie per la risposta.
allora, alcuni dubbi:
il mio lista non è un ArrayList di ArrayList, ma un ArrayList di array. questo perche sto leggendo delle righe da un file, e ogni riga la trasformo in un array con la String[] str_list = line.trim().split("\\s").
il singolo elemento da inserire nell'array list è un array della forma, per esempio: [0 1 2 3]. l'obiettivo finale sarebbe quello di ottenere una roba del tipo: [[0 1 2 3] [0 2 4 6 8] [0 3 4 5 8 9 11 12]].
facendo come faccio io (sbagliando), mi viene invece una roba del tipo:
[0 1 2 3 0 2 4 6 8 0 3 4 5 8 9 11 12], ovvero mi aggiunge il pezzetto di array in fila al precedente, non considerandoli come elementi diversi, in posizione diversa nell'ArrayList.
detto ciò, come gestisco la seconda e la terza frazione di codice che mi hai suggerito tu? considerato che io so prima quanti sono gli elementi dell'ArrayList (ovvero quati array devo inserire) e so la lunghezza, di volta in volta, degli array.
grazie mille.
wingman87
25-08-2011, 10:20
Alla fine è solo una questione di tipi, i metodi da usare restano gli stessi. La dichiarazione della lista sarà:
ArrayList<String[]> list = new ArrayList<String[]>();
Mentre l'inserimento dell'array str_list:
list.add(str_list);
La terza parte del codice che avevo scritto prima non ti serve in questo caso.
Oppure puoi utilizzare un ArrayList di ArrayList di String (la dichiarazione è quella del mio primo post) ed aggiungere gli elementi in questo modo:
Collections.addAll(list, str_list);
In questo caso dovrai anche fare l'inizializzazione dell'ArrayList
Riferimenti:
http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html
http://download.oracle.com/javase/6/docs/api/java/util/Collections.html
FrankieB76
25-08-2011, 10:24
adesso provo con ilprimo suggerimento. in pratica mi dici che banalmente avevo sbagliato la dichiarazione dell'ArrayList, mettendo invece di
ArrayList list = new ArrayList();
un
ArrayList<String[]> list = new ArrayList<String[]>();
così dovrebbe funzionare anche la .add che invece a me non funzionava.
vediamo che succede. comunque mi sbircio anche la Class Collections che non conoscevo!
grazie ancora, ciao! :)
wingman87
25-08-2011, 10:31
così dovrebbe funzionare anche la .add che invece a me non funzionava.
Se ho capito bene tu con .add aggiungevi un elemento dell'array, non l'array intero. L'errore è quello.
La questione dei tipi generici è utile ai fini dei check statici di compilazione, ma non è un errore (non lo è se non li dichiari, e in tal caso il compilatore restituisce un warning, lo è se dichiari i tipi generici sbagliati ma in questo caso il compilatore non compila).
FrankieB76
25-08-2011, 10:37
guarda, aggiungevo non il singolo elemento array ad una serie di array, ma il contenuto del singolo array veniva messo in fila appresso agli altri contenuti. ma adesso mi sembra chiaro il perche! :)
FrankieB76
25-08-2011, 11:12
però la .add continua a non funzionare.
io devo aggiungere la mia stringa che è:
String[] str_list = line.trim().split("\\s");
ovvero la leggo da un file, e poi faccio la add come:
lista.add (Integer.parseInt(str_list[i]));
ovviamente col fatto che la lista di stringhe la trasformo in interi ho cambiato anche la dichiarazione dell'ArrayList in:
ArrayList <int []> lista = new ArrayList<int []> ();
oppure ho provato lasciando la dichiarazione dell'ArrayList con le stringhe, e aggiungendo:
lista.add (str_list[i]);
ma mi da sempre errore con la add, mi dice di aggiungere un argomento [], cosa che non mi chiedeva le altre volte che l'ho usata...
wingman87
25-08-2011, 11:29
Il fatto è che str_list[i] è un elemento dell'array, non l'array.
Quindi con
lista.add(str_list[i]);
aggiungi un elemento a lista, non ad uno degli array contenuti in lista.
Ecco come potresti fare:
String[] str_list = line.trim().split("\\s");
int numElements = str_list.length;
int[] intArray = new int[numElements];
for(int i = 0; i < numElements; i++)
{
intArray[i] = Integer.parseInt(str_list[i]);
}
lista.add(intArray);
E la dichiarazione giusta di lista è l'ultima che hai usato:
ArrayList<int[]> lista = new ArrayList<int[]>();
FrankieB76
25-08-2011, 11:31
hai ragione, quell'è l'elemento dell'array, non tutto l'array secco...
adesso provo!
FrankieB76
25-08-2011, 11:56
credo adesso funzioni tutto. un'unica cosa, cercavo di far stampare i risultati per vedere cosa usciva fuori, e se do il comando
System.out.println("intArray è :" + intArray);
oppure
System.out.println ("la lista è : " + "elemento " + i + " " + lista.get(i));
mi restituisce nei risultati:
intArray è :[I@41d5550d
e
la lista è : elemento 0 [I@3d4b7453
la lista è : elemento 1 [I@24c21495
la lista è : elemento 2 [I@41d5550d
mi sa che devo lavorare sull'uscita dell'output, per ottenere una roba del tipo:
[[0 1 2 3] [0 2 4 6 8] [0 3 4 5 8 9 11 12]]
wingman87
25-08-2011, 12:28
Potresti usare il metodo toString di Arrays:
http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#toString%28int[]%29
for(int[] intArray : lista)
Arrays.toString(intArray);
NathanNever77
25-08-2011, 12:34
Avendo qualche nozione base di C e cercando ora di capire qualcosa di Java per me è naturale proporti il metodo printf:
System.out.printf();
Ciao!
NN
wingman87
25-08-2011, 12:39
Potresti usare il metodo toString di Arrays:
http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#toString%28int[]%29
for(int[] intArray : lista)
Arrays.toString(intArray);
Scusa, mi quoto da solo perché ho dimenticato una piccola cosa importante:
for(int[] intArray : lista)
System.out.println(Arrays.toString(intArray));
FrankieB76
25-08-2011, 12:46
mi da errore <Duplicate local variable intArray> nel momento in cui riscrivo intArray, mi dice di rinominarlo...
for(int[] intArray : lista)
esattamente cosa fa? è un for che cicla per tutte le occorrenze di intArray dentro lista?
wingman87
25-08-2011, 12:51
E' una sintassi che puoi utilizzare quando la collezione che stai iterando implementa l'interfaccia Iterable (e ArrayList l'implementa). Puoi usarla anche per gli array.
Riguardo l'errore: puoi usare un altro nome, anche se secondo me hai dichiarato il primo intArray in un blocco più esterno del necessario.
FrankieB76
25-08-2011, 12:57
ho risolto chiamandolo semplicemente intArray2, avevo intuito il funzionamento.
adesso da dei risultati un po' incasinati, ma suppongo debba lavorarci sopra. per esempio nei risultati finali l'ultima componente resta uno 0, invece del numero che dovrebbe essere.... :muro:
FrankieB76
26-08-2011, 09:08
problemino... con il codice:
for(int[] intArray2 : lista)
System.out.println(Arrays.toString(intArray));
mi stampa l'ultimo elemento dell'ArrayList, tante volte quanti sono gli elementi dell'ArrayList.
ho fatto il debug passo passo e ho visto che nella locazione di memoria dov'è l'ArrayList ci sono tutti i diversi elementi presenti, ma stampa sempre e solo l'ultimo, ripetuto come detto.
in cosa sbaglio? forse perche prende intArray di "Arrays.toString(intArray)", che effettivamente contiene l'ultimo array inserito nell'ArrayList?
FrankieB76
26-08-2011, 09:43
ok, dovrei aver risolto con:
a = lista.size();
for (i=0;i<a;i++)
{
int [] app = lista.get(i);
for (j=0;j<app.length;j++)
{
System.out.println(app[j]);
}
}
wingman87
26-08-2011, 12:13
Il problema era che ciclavi su lista usando la variabile intArray2 ma poi stampavi intArray (senza 2).
Comunque ribadisco che secondo me hai dichiarato intArray in un blocco più esterno del necessario.
FrankieB76
27-08-2011, 10:13
hmmm... no, veramente era dichiarato nello stesso metodo... boh?
wingman87
27-08-2011, 11:23
Puoi postare il codice completo così ti spiego quello che intendo (sempre se è come immaginavo).
FrankieB76
27-08-2011, 11:50
certo, ecco il contenuto del ciclo while di lettura del file:
while(line != null)
{
System.out.println();
System.out.println("ciclo while numero " + contawhile);
contawhile++;
if(line.trim().equals(""))
{
line = bufRead.readLine();
continue;
} //fine check controllo linee vuote
String[] str_list = line.trim().split("\\s");
int numElements = str_list.length; //lunghezza linea
System.out.println("numElements: "+ numElements);
int[] intArray = new int[numElements]; //creo l'array che mi servirà dopo
int i=0; //contatore
for (i=0; i<numElements; i++)
{
System.out.println();
System.out.println("valore di i: " + i);
intArray[i] = Integer.parseInt(str_list[i]);
} //fine for
lista.add(intArray);
System.out.println();
System.out.println("questo è un cammino: " + line + "\n");
i=0;
int j=0;
a = lista.size();
System.out.println("la size dell'ArrayList è :" + a);
System.out.println ("la lista è : ");
for (i=0;i<a;i++)
{
int [] app = lista.get(i);
System.out.println("elemento " + i + ":");
for (j=0;j<app.length;j++)
{
System.out.println(app[j]);
}
}
line = bufRead.readLine(); //passa alla linea successiva
}
wingman87
27-08-2011, 12:11
Ok, non è come immaginavo :p
Pensavo stampassi lista alla fine degli inserimenti, invece stampi anche i contenuti parziali.
Comunque ti consiglio di suddividere il codice in più metodi, è più semplice leggerlo, gestirlo ed è più riutilizzabile.
FrankieB76
27-08-2011, 12:12
si si certo, per adesso verifico il funzionamento (non ho mica finito!!!) poi vedo come metterlo in modo decente! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.