2011-01-21 11 views
10

Configuración de una lista de valores para un ArrayList de Java que funciona:establecer directamente los valores de un ArrayList en Java

Integer[] a = {1,2,3,4,5,6,7,8,9}; 
ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList(a)); 

Sin embargo, el siguiente no funciona y tiene el error "inicio ilegal de tipo", así como otro. Por qué no? Como la primera línea en el primer bloque de código es simplemente asignación, ¿no debería tener un efecto?

ArrayList<Integer> possibleValues2 = new ArrayList<Integer>(Arrays.asList({1,2,3,4,5,6,7,8,9})); 
+5

Wow. Se están repartiendo muchos puntos considerando que nadie está respondiendo la pregunta. El OP no preguntó cuáles eran las otras opciones, sino por qué esto no funciona. Duplicado de http://stackoverflow.com/questions/3504849/java-weird-array-behavior. – Robin

+0

@Robin Pero las respuestas son sin embargo en su mayoría verdaderas y perspicaces. La respuesta estándar trivial a la pregunta literal a menudo no es la mejor respuesta. –

+0

Como mi respuesta fue rechazada injustamente, la eliminé. Sin embargo, aquí hay una respuesta anterior a una pregunta similar: http://stackoverflow.com/questions/4324633/how-to-convert-an-int-array-to-a-list/4324662#4324662 –

Respuesta

20

Debe utilizar la versión vararg de Arrays.asList, por ejemplo,

ArrayList<Integer> possibleValues2 = 
    new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9)); 

o crear explícitamente un parámetro de matriz, p.

ArrayList<Integer> possibleValues2 = 
    new ArrayList<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9})); 
3

Otra opción es el uso de la guayaba ("colecciones de Google"), que tiene un método Lists.newArrayList(...).

Su código sería algo así como

ArrayList<Integer> possibleValues2 = Lists.newArrayList(1,2,3,4,...); 
+0

Aunque esta respuesta es muy buena (+1), fallaría con el mismo error que 'Arrays.asList()' cuando se llama con una matriz int [] –

+1

Para una matriz 'int []', 'Lists.newArrayList (Ints.asList (intArray)) 'funcionaría sin embargo. – ColinD

+0

Muy extraño. Acabo de ejecutar lo siguiente en mi máquina: public void testArrayList() { ArrayList list = Lists.newArrayList (3,4); assertEquals ("[3, 4]", list.toString()); } Y no tuve problemas en absoluto, pero podría estar trabajando con una versión más nueva de Guava. – Uri

6

Una expresión utilizada extraño y poco,

List<Integer> ints = new ArrayList<Integer>() {{add(1); add(2); add(3);}} 

Esto está creando una clase anónima que se extiende ArrayList (soportes exteriores), y luego se implementa la instancia inicializador (corchetes internos) y llamadas List.add() allí.

Una buena pregunta para la entrevista, si nada más.

+0

¡Eso es tan astuto! Gracias. –

+2

Por supuesto, es bueno saber esto y definitivamente valioso para las entrevistas ya que esta es una pregunta común, pero consideraría una mala práctica crear subclases anónimas de clases estándar como ArrayList. Desde el punto de vista de un OOP, una clase solo debe extenderse si la nueva clase tiene funcionalidad que la clase anterior falla. Y ensuciará su base de código con nombres de subclases OuterClass $ 1.class o similar. –

+0

eso es cierto, pero solo lo tomaría en serio si planea volver a usar la clase. las clases anónimas son para conveniencia en línea y no reutilización. o, otra forma de verlo ... estoy creando un nuevo subtipo de ArrayList que se inicializa en un conjunto de valores estáticos. la funcionalidad es la inicialización del conjunto dado de valores estáticos. –

0

a partir de documentos de Java SE 7:

List<Integer> possibleValues2 = Arrays.asList(1,2,3,4,5,6,7,8,9); 
Cuestiones relacionadas