 
View Full Version : [JAVA] ArrayList di int?
wingman87
21-02-2008, 10:56
Ho scritto questo codice:
//Costruisce un array di interi della stessa lunghezza della lista, contenente i campi data della
//lista. Ogni intero è il campo data contenuto nella posizione della lista corrispondente
//all'indice dell'array: 0 indica la prima posizione (quella di testa), 1 la seconda e così via,
//fino alla lunghezza della lista meno una unità.
public int[] toArray(){
	ArrayList<Integer> array=new ArrayList<Integer>();
	ListElem iterator=first;
	while(iterator!=null){
		array.add(iterator.getDato());
		iterator=iterator.getNext();
	}
	Integer vett[]={};
	vett=(Integer[])array.toArray(vett);
	int nuovoVett[]=new int[vett.length];
	for(int i=0;i<vett.length;i++)
		nuovoVett[i]=vett[i].intValue();
	return nuovoVett;
}
Solo che non mi piace molto la parte che ho evidenziato in rosso. Mi sarebbe piaciuto passare direttamente dall'ArrayList all'array di int senza passare per l'array di Integer, solo che l'ArrayList non lo posso dichiarare <int>.
Soluzioni? Grazie, ciao!
Ecco uno spunto, ma non ho il tempo di testarlo:
//Costruisce un array di interi della stessa lunghezza della lista, contenente i campi data della
//lista. 
public int[] toArray() {
	ListElem iterator = first;
        int n = 0;
	while(iterator != null) {
		iterator = iterator.getNext();
                n++;
	}
	int nuovoVett[] = new int[n];
        iterator = first;
        
	for (int i = 0; i < n; i++) {
		nuovoVett[i] = iterator.getDato();
                iterator = iterator.getNext();
        }
	return nuovoVett;
}
wingman87
21-02-2008, 16:02
Innanzitutto ti ringrazio, pero' quello che volevo fare io era usare sempre l'ArrayList, magari anche dichiarandolo in un altro modo. La tua soluzione e' senza dubbio funzionante ma non e' quello che mi sarebbe piaciuto fare, la soluzione ideale sarebbe una cosa tipo:
public int[] toArray(){
	ArrayList<int> array=new ArrayList<int>();
	ListElem iterator=first;
	while(iterator!=null){
		array.add(iterator.getDato());
		iterator=iterator.getNext();
	}
	int vett[]={};
	return (int[])array.toArray(vett);
}
solo che non posso dichiarare l'ArrayList come un array di tipo semplice.
In pratica quello che mi serve non e' tanto la soluzione dell'esercizio, vorrei solo sapere qualcosa di piu' sull'uso di ArrayList
Innanzitutto ti ringrazio, pero' quello che volevo fare io era usare sempre l'ArrayList, magari anche dichiarandolo in un altro modo. La tua soluzione e' senza dubbio funzionante ma non e' quello che mi sarebbe piaciuto fare, la soluzione ideale sarebbe una cosa tipo:
public int[] toArray(){
	ArrayList<int> array=new ArrayList<int>();
	ListElem iterator=first;
	while(iterator!=null){
		array.add(iterator.getDato());
		iterator=iterator.getNext();
	}
	int vett[]={};
	return (int[])array.toArray(vett);
}
solo che non posso dichiarare l'ArrayList come un array di tipo semplice.
In pratica quello che mi serve non e' tanto la soluzione dell'esercizio, vorrei solo sapere qualcosa di piu' sull'uso di ArrayList
Invece secondo me la soluzione ideale, come complessità in tempo e spazio, dato il contesto, dovrebbe essere proprio quella che ti ho descritto. Comunque riguardo a List<T> e derivati... ci puoi mettere solo istanze di oggetti, i tipi primitivi rimangono fuori.
Un consiglio tra le righe? Fornisci un metodo di ListElem, anche solo privato, che tenga traccia della dimensione della lista dinamica. Salveresti capra e cavoli... ma se ListElem non può essere estesa o modificata allora fa come se non ti avessi detto niente :fiufiu:
wingman87
21-02-2008, 18:40
Purtroppo non posso aggiungere nulla, a parte i metodi richiesti.
A sto punto sì, la tua è la soluzione migliore. Peccato che non esista nulla di simile ad ArrayList per i tipi primitivi.. Grazie ancora.
AnonimoVeneziano
21-02-2008, 18:47
ArrayList<Integer> ?
Ciao
wingman87
21-02-2008, 19:22
ArrayList<Integer> ?
Ciao
E' la soluzione che ho usato all'inizio, c'è il codice nel primo post, solo che richiede un passaggio in più perché alla fine la funzione deve restituire un int[] non un Integer[]
AnonimoVeneziano
21-02-2008, 21:01
E' la soluzione che ho usato all'inizio, c'è il codice nel primo post, solo che richiede un passaggio in più perché alla fine la funzione deve restituire un int[] non un Integer[]
Qual'è la necessità di usare int[] anzichè Integer[]? Con l'autoboxing usare un Integer[] e un int[] ha poca differenza
wingman87
21-02-2008, 21:37
Qual'è la necessità di usare int[] anzichè Integer[]? Con l'autoboxing usare un Integer[] e un int[] ha poca differenza
Puoi spiegarmi meglio questa cosa? In teoria in questo caso con l'autoboxing potrei fare questo?
public int[] toArray(){
	ArrayList<Integer> array=new ArrayList<Integer>();
	ListElem iterator=first;
	while(iterator!=null){
		array.add(iterator.getDato());
		iterator=iterator.getNext();
	}
	return (Integer[])array.toArray(new Integer[]));
}
Ma mi da errore perché la funzione deve tornare int
^TiGeRShArK^
21-02-2008, 21:45
Puoi spiegarmi meglio questa cosa? In teoria in questo caso con l'autoboxing potrei fare questo?
public int[] toArray(){
	ArrayList<Integer> array=new ArrayList<Integer>();
	ListElem iterator=first;
	while(iterator!=null){
		array.add(iterator.getDato());
		iterator=iterator.getNext();
	}
	return (Integer[])array.toArray(new Integer[]));
}
Ma mi da errore perché la funzione deve tornare int
il problema è che ti dovrebbe restituire un array di Integer e tu dovresti potere usare gli elementi di quest'ultimo in maniera del tutto trasparente grazie all'autoboxing/autounboxing introdotto da java 5 in poi.
wingman87
21-02-2008, 21:54
Quindi mi basta cambiare in Integer[] il tipo di ritorno del metodo e sono a posto senza modificare nient'altro nelle chiamate del metodo? Credo di poterlo fare.. domani in laboratorio dove ho tutto il codice provo. Grazie!
Mi sarebbe piaciuto passare direttamente dall'ArrayList all'array di int senza passare per l'array di Integer, solo che l'ArrayList non lo posso dichiarare <int>.
Ma mi da errore perché la funzione deve tornare int
Avevo capito che la firma del metodo non si potesse cambiare...
Quindi mi basta cambiare in Integer[] il tipo di ritorno del metodo e sono a posto senza modificare nient'altro nelle chiamate del metodo? Credo di poterlo fare.. domani in laboratorio dove ho tutto il codice provo. Grazie!
Non è detto. Il compilatore si incavola se all'esterno del metodo accade una cosa tipo:
int[][] matrix = ...
matrix[0] = wingmanList.toArray(); // il tuo metodo restituisce Integer[]!!
:rolleyes:
wingman87
21-02-2008, 22:31
Avevo capito che la firma del metodo non si potesse cambiare...
Infatti non si può cambiare
Non è detto. Il compilatore si incavola se all'esterno del metodo accade una cosa tipo:
int[][] matrix = ...
matrix[0] = wingmanList.toArray(); // il tuo metodo restituisce Integer[]!!
:rolleyes:
Doh! Allora avevo capito male la questione dell'autoboxing. Pensavo di poter cambiare il tipo di ritorno senza problemi. Allora ribadisco che il tipo di ritorno è int[] :) 
Mi sa che devo lasciar perdere l'ArrayList vero? :stordita:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.