De Arraylist a Array

111

Quiero saber si es seguro / recomendable convertir de ArrayList a Array. Tengo un archivo de texto con cada línea una cadena:

1236
1233
4566
4568
....

Quiero leerlos en una lista de matrices y luego la convierto a Matriz. ¿Es aconsejable / legal hacer eso?

Gracias

Eddy Freeman
fuente
8
Usted puede , pero no se nos ha dado información suficiente para decir si es una idea buena o no.
Jon Skeet
6
Los ArrayLists están bien. La única razón que puedo ver para convertir a una matriz es si necesita llamar a un método que lo requiera.
Mike Jones

Respuestas:

214

, es seguro convertir un archivo ArrayListen unArray . Que sea una buena idea depende del uso previsto. ¿Necesitas las operaciones que te ArrayListbrinda? Si es así, manténgalo en formato ArrayList. ¡Si no, conviértase!

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);

salidas

bar.length = 5
OscuroRobot
fuente
¿Qué pasa si ArrayList está vacío?
ThanosFisherman
48
Entonces está vacío.
IMustBeSomeone
1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke
75

Esta es la mejor manera (en mi humilde opinión).

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

Este código también funciona:

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

Pero es menos efectivo: la matriz de cadenas se crea dos veces: la primera vez que se crea una matriz de longitud cero, luego se crea, completa y devuelve la matriz de tamaño real. Entonces, si ya conoce el tamaño necesario (de list.size()), debe crear una matriz que sea lo suficientemente grande como para colocar todos los elementos. En este caso, no se reasigna.

AlexR
fuente
4
buena explicación de la diferencia entre new String[0]ynew String[size]
gamliela
4
new String[0]es en realidad más eficiente. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef
5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

Si es una "buena idea" realmente dependerá de su caso de uso.

Brian Roach
fuente
gracias, solo tengo curiosidad por saber: ¿no necesito declarar el tamaño de la matriz?
Eddy Freeman
JavaDocs es tu amigo. Si la matriz que se pasa es demasiado pequeña, se devuelve una nueva matriz. La otra versión del método que no acepta argumentos devuelve una matriz deObject
Brian Roach
3

asumiendo que v es una ArrayList:

String[] x = (String[]) v.toArray(new String[0]);
Erhan Bagdemir
fuente
1

Hay dos estilos para convertir una colección en una matriz: usando una matriz pre-dimensionada (como c.toArray(new String[c.size()])) o usando una matriz vacía (como c.toArray(new String[0])). En las versiones anteriores de Java, se recomendaba el uso de una matriz de tamaño predeterminado, ya que la llamada de reflexión que es necesaria para crear una matriz del tamaño adecuado era bastante lenta. Sin embargo, desde las últimas actualizaciones de OpenJDK 6, esta llamada estaba intrinsificada, lo que hace que el rendimiento de la versión de matriz vacía sea el mismo y, a veces, incluso mejor, en comparación con la versión de tamaño predeterminado. Además, pasar una matriz de tamaño predeterminado es peligroso para una colección simultánea o sincronizada, ya que es posible una carrera de datos entre el tamaño y la llamada toArray, lo que puede dar como resultado nulos adicionales al final de la matriz, si la colección se redujo simultáneamente durante la operación. Puedes seguir el estilo uniforme:ya sea usando una matriz vacía (que se recomienda en Java moderno) o usando una matriz pre-dimensionada (que podría ser más rápida en versiones anteriores de Java o JVMs no basadas en HotSpot) .

Alexander Savin
fuente
1

Este es el uso recomendado para Java más nuevo (> Java 6)

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

En las versiones anteriores de Java, se recomendaba el uso de una matriz de tamaño predeterminado, ya que la llamada de reflexión que es necesaria para crear una matriz del tamaño adecuado era bastante lenta. Sin embargo, desde las últimas actualizaciones de OpenJDK 6, esta llamada estaba intrinsificada, lo que hace que el rendimiento de la versión de matriz vacía sea el mismo y, a veces, incluso mejor, en comparación con la versión de tamaño predeterminado. Además, pasar una matriz de tamaño predeterminado es peligroso para una colección simultánea o sincronizada, ya que es posible una carrera de datos entre el tamaño y la llamada toArray, lo que puede dar como resultado nulos adicionales al final de la matriz, si la colección se redujo simultáneamente durante la operación. Esta inspección permite seguir el estilo uniforme: ya sea usando una matriz vacía (que se recomienda en Java moderno) o usando una matriz pre-dimensionada (que podría ser más rápida en versiones anteriores de Java o JVMs no basadas en HotSpot).

majurageerthan
fuente
0

La interfaz Collection incluye el método toArray () para convertir una nueva colección en una matriz. Hay dos formas de este método. La versión sin argumento devolverá los elementos de la colección en una matriz de Objetos: public Object [] toArray (). La matriz devuelta no se puede convertir a ningún otro tipo de datos. Ésta es la versión más sencilla. La segunda versión requiere que pase el tipo de datos de la matriz que le gustaría devolver: 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);  
           }  
      }  

para referencia, consulte este enlace http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html

satish
fuente
0

Un enfoque sería agregar el segundo bucle for donde la impresión se realiza dentro del primer bucle for. Me gusta esto:

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]);
       }
   }    

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

Depende de lo que desee lograr si necesita manipular la matriz más adelante, costaría más esfuerzo que mantener la cadena en ArrayList. También tiene acceso aleatorio con un ArrayList porlist.get( index );

apilador
fuente