Da Arraylist a Array


111

Voglio sapere se è sicuro / consigliabile convertire da ArrayList a Array? Ho un file di testo con ogni riga una stringa:

1236
1233
4566
4568
....

Voglio leggerli nella lista degli array e poi convertirli in Array. È consigliabile / legale farlo?

Grazie


8
È possibile , ma non ci ha dato quasi abbastanza informazioni di dirvi se è una buona idea o no.
Jon Skeet

6
Gli ArrayList vanno bene. L'unico motivo che posso vedere per la conversione in un array è se devi chiamare un metodo che lo richiede.
mike jones

Risposte:


214

, è sicuro convertire ArrayListun fileArray . Che sia una buona idea dipende dall'uso previsto. Hai bisogno delle operazioni che ArrayListprevede? Se è così, tienilo un ArrayList. Altrimenti convertiti!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

uscite

bar.length = 5

Cosa succede se ArrayList è vuoto?
ThanosFisherman

48
Quindi è vuoto.
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke

75

Questo è il modo migliore (IMHO).

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

Questo codice funziona anche:

String[] myArray = myArrayList.toArray(new String[0]);

Ma è meno efficace: l'array di stringhe viene creato due volte: la prima volta che viene creato un array di lunghezza zero, poi viene creato, riempito e restituito l'array di dimensioni reali. Quindi, se conosci la dimensione necessaria (da list.size()), dovresti creare un array abbastanza grande da contenere tutti gli elementi. In questo caso non viene riallocato.


4
buona spiegazione della differenza tra new String[0]enew String[size]
gamliela

4
new String[0]è effettivamente più efficiente. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

Che sia una "buona idea" dipenderà davvero dal tuo caso d'uso.


grazie, solo curioso di sapere: non ho bisogno di dichiarare la dimensione dell'array?
Eddy Freeman

JavaDocs sono tuoi amici. Se l'array passato è troppo piccolo, viene restituito un nuovo array. L'altra versione del metodo che non accetta argomenti restituisce un array diObject
Brian Roach

3

supponendo che v sia un ArrayList:

String[] x = (String[]) v.toArray(new String[0]);

1

Esistono due stili per convertire una raccolta in un array: utilizzando un array pre-dimensionato (simile c.toArray(new String[c.size()])) o utilizzando un array vuoto (simile c.toArray(new String[0])). Nelle versioni precedenti di Java si consigliava di utilizzare un array pre-dimensionato, poiché la chiamata di riflessione necessaria per creare un array di dimensioni adeguate era piuttosto lenta. Tuttavia, poiché gli ultimi aggiornamenti di OpenJDK 6 questa chiamata è stata intrinseca, rendendo le prestazioni della versione con array vuoto uguali e talvolta anche migliori, rispetto alla versione pre-dimensionata. Anche il passaggio di un array pre-dimensionato è pericoloso per una raccolta simultanea o sincronizzata poiché è possibile una corsa di dati tra la dimensione e la chiamata toArray, che potrebbe comportare null aggiuntivi alla fine dell'array, se la raccolta è stata ridotta contemporaneamente durante l'operazione. Puoi seguire lo stile dell'uniforme:utilizzando un array vuoto (consigliato nella moderna Java) o utilizzando un array pre-dimensionato (che potrebbe essere più veloce nelle versioni Java precedenti o in JVM non basate su HotSpot) .


1

Questo è l'utilizzo consigliato per Java più recente (> Java 6)

String[] myArray = myArrayList.toArray(new String[0]);

Nelle versioni precedenti di Java si consigliava di utilizzare un array pre-dimensionato, poiché la chiamata di riflessione necessaria per creare un array di dimensioni adeguate era piuttosto lenta. Tuttavia, poiché gli ultimi aggiornamenti di OpenJDK 6 questa chiamata è stata intrinseca, rendendo le prestazioni della versione con array vuoto uguali e talvolta anche migliori, rispetto alla versione pre-dimensionata. Anche il passaggio di un array pre-dimensionato è pericoloso per una raccolta simultanea o sincronizzata poiché è possibile una corsa di dati tra la dimensione e la chiamata toArray, che potrebbe comportare null aggiuntivi alla fine dell'array, se la raccolta è stata ridotta contemporaneamente durante l'operazione. Questa ispezione consente di seguire lo stile uniforme: utilizzando un array vuoto (consigliato nel Java moderno) o un array pre-dimensionato (che potrebbe essere più veloce nelle versioni Java precedenti o JVM non basate su HotSpot).


0

L'interfaccia Collection include il metodo toArray () per convertire una nuova raccolta in un array. Esistono due forme di questo metodo. La versione senza argomenti restituirà gli elementi della raccolta in un array Object: public Object [] toArray (). La matrice restituita non può eseguire il cast a nessun altro tipo di dati. Questa è la versione più semplice. La seconda versione richiede di passare il tipo di dati dell'array che desideri restituire: public Object [] toArray (Object type []).

 public static void main(String[] args) {  
           List<String> l=new ArrayList<String>();  
           l.add("A");  
           l.add("B");  
           l.add("C");  
           Object arr[]=l.toArray();  
           for(Object a:arr)  
           {  
                String str=(String)a;  
                System.out.println(str);  
           }  
      }  

per riferimento, fare riferimento a questo collegamento http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

Un approccio potrebbe essere quello di aggiungere il secondo ciclo for in cui la stampa viene eseguita all'interno del primo ciclo for. Come questo:

static String[] SENTENCE; 

public static void main(String []args) throws Exception{

   Scanner sentence = new Scanner(new File("assets/blah.txt"));
   ArrayList<String> sentenceList = new ArrayList<String>();

   while (sentence.hasNextLine())
   {
       sentenceList.add(sentence.nextLine());
   }

   sentence.close();

   String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
  // System.out.println(sentenceArray.length);
   for (int r=0;r<sentenceArray.length;r++)
   {
       SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

       for (int i=0;i<SENTENCE.length;i++)
       {
           System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

Dipende da cosa si desidera ottenere se è necessario modificare l'array in un secondo momento, costerebbe uno sforzo maggiore rispetto a mantenere la stringa in ArrayList. Hai anche accesso casuale con un ArrayList dilist.get( index );

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.