2012-03-15 26 views
9

Estoy tratando de convertir algún código python a java y necesito configurar un valor predeterminado de una lista. Sé el valor predeterminado, el tamaño de la lista y mi objetivo es configurar un valor predeterminado y luego, en mi programa, cambiarlos. En Python simplemente hacer esto (para crear 10 artículos con un valor de cero):¿Cómo establecer un valor predeterminado para la lista de elementos?

list = [0]*10 

que estoy tratando de hacer:

List<Integer> list1 = Arrays.asList(0*10); // it just multiples 0 by 10. 

Se doest funciona, sé que puedo hacer algo como esto :

for(int i = 0;i<10;i++) 
{ 
    list1.add(0); 
} 

Me preguntaba si había una forma mejor (en lugar del bucle for)?

+0

¿Podría usar una matriz en lugar de una lista? –

+0

@MarkByers Realmente no importa, pero he leído que las listas tienen un mejor rendimiento porque el tamaño es fijo, por eso fui por esa ruta. No es muy importante lo que uso, aunque desde que estoy aprendiendo solo quiero aprender las herramientas adecuadas para las tareas correctas. –

+1

@learningJava: No, es al revés: * las matrices * tienen un tamaño fijo. Pero las listas son generalmente más flexibles. –

Respuesta

18

Arrays.fill le permite evitar el bucle.

Integer[] integers = new Integer[10]; 
Arrays.fill(integers, 0); 
List<Integer> integerList = Arrays.asList(integers); 
+0

Tenga en cuenta que esa lista tendrá un tamaño * fijo * - no puede agregar a ella o eliminar de ella. Eso puede ser o no lo que se quiere. –

+0

@JonSkeet, de acuerdo. Interpreté eso como deseado debido a "Sé el valor predeterminado, el tamaño de la lista ...". –

+0

Esto es correcto, es un tamaño fijo y por eso elegí listas en primer lugar. Estoy un poco confundido, entiendo las dos primeras líneas, usted hizo una lista que contiene 10 elementos y luego utilizó arrays.fill para configurar todo en ceros, ¿por qué se necesita la tercera línea? –

-1

En Java, no realmente. Java es relativamente detallado cuando se trata de este tipo de cosas, por lo que no hay mucho que puedas hacer que sea simple, aparte de un bucle como el que tienes.

+0

Como podemos ver por las respuestas anteriores, esta es una declaración falsa –

2

No hay nada incorporado en las bibliotecas estándar, que yo sepa. Pero puede escribir fácilmente dicho método una vez y llamarlo desde donde desee. Por ejemplo:

public static <T> List<T> newArrayList(T value, int size) { 
    List<T> list = new ArrayList<T>(size); 
    for (int i = 0; i < size; i++) { 
     list.add(value); 
    } 
    return list; 
} 

Si no desea cambiar el tamaño de la lista (es decir, añadir o eliminar elementos), la respuesta de Mike Samuel es probablemente más eficiente. También tenga en cuenta que si usted está utilizando un tipo mutable, que no puede obtener lo que quiere:

List<StringBuilder> list = newArrayList(new StringBuilder(), 10); 
list.get(0).append("Foo"); 
System.out.println(list.get(5)); // Prints "Foo" 

... ya que cada elemento de la lista será una referencia al mismo objeto.

3

¿Quizás solo necesite una matriz?

int[] array = new int[10]; 

Necesita una lista si necesita cambiar el tamaño de la misma dinámicamente. Si no necesita esta característica, una matriz puede satisfacer sus necesidades, y automáticamente inicializará todos los valores a 0 por usted.

0

que puede probar:

List<Integer> list1 = Arrays.asList(0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 

Hay 10 ceros. Necesita saber la cantidad de elementos en el tiempo de compilación, pero solo tiene una línea. Si no conoce la cantidad de elementos en tiempo de compilación, puede usar el enfoque Arrays.fill() sugerido.

+2

Por favor, no haga que los mantenedores de su código cuenten los 0. Los comentarios no ayudarán, ya que un mantenedor no puede asumir que son consistentes con el código. –

+0

Realmente estaba tratando de evitar eso. Soy bastante flojo y no me gusta escribir mucho. Además, mis datos son unos miles de ceros, así que podría anular la garantía de mi teclado si escribo tanto :-) –

+0

Sí, eso fue realmente una oportunidad para menos valores init. No me gusta el código, tampoco. –

0

Me quedaría con el bucle for.

BTW ...0 * 10 = 0 por lo que acaba de entrar en la cantidad que necesita en lugar

ArrayList<Integer> list = new ArrayList<Integer>(10);

+0

'list.size()' devolverá 0. Not 10. –

7

Collections.nCopies es su amigo si usted necesita una lista en lugar de una matriz:

List<Integer> list = Collections.nCopies(10, 0); 

Si se necesita una lista mutable envuélvalo:

List<Integer> list = new ArrayList<>(Collections.nCopies(10, 0)); 
Cuestiones relacionadas