Creando una lista con elemento repetido

82

¿Existe un método de utilidad en Java que genere una lista o matriz de una longitud especificada con todos los elementos iguales a un valor especificado (por ejemplo, ["foo", "foo", "foo", "foo", "foo"])?

laurt
fuente

Respuestas:

144

Puede utilizar Collections.nCopies. Tenga en cuenta que esto copia la referencia al objeto dado, no al objeto en sí. Si está trabajando con cadenas, no importará porque de todos modos son inmutables.

List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]
arshajii
fuente
20

Para una matriz, puede usar Arrays.fill (Object [] a, Object val)

String[] strArray = new String[10];
Arrays.fill(strArray, "foo");

y si necesitas una lista, usa

List<String> asList = Arrays.asList(strArray);

Entonces tengo que usar dos líneas: String [] strArray = new String [5]; Arrays.fill (strArray, "foo") ;. ¿Existe una solución de una línea?

Puede usar Collections.nCopies (5, "foo") como una solución de una línea para obtener una lista:

List<String> strArray = Collections.nCopies(5, "foo");

o combinarlo con toArraypara obtener una matriz.

String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
René Link
fuente
1
Entonces tengo que usar dos líneas: String[] strArray = new String[5]; Arrays.fill(strArray, "foo");. ¿Existe una solución de una sola línea?
laurt
Muy simple: Collections.nCopies (5, "foo") Thkns!
Marcelo Rebouças
4

Versión que puede utilizar para matrices primitivas (Java 8):

DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals

Tenga en cuenta que vuelve double[], noDouble[]

Funciona para IntegerStream, DoubleStream, LongStream

maxpovver
fuente
1

Con IntStream, puede generar un rango de números enteros, asignarlos al elemento que desee y recopilarlo como una lista.

List<String> list = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .collect(Collectors.toList());

O como una matriz

 String[] arr = IntStream.rangeClosed(0, 5)
            .mapToObj(i -> "foo")
            .toArray(String[]::new);
usuario7
fuente
1

Si su objeto no es inmutable o no tiene una referencia transparente, puede usar

Stream.generate(YourClass::new).limit(<count>)

y recógelo para listar

.collect(Collectors.toList())

o a la matriz

.toArray(YourClass[]::new)
Hohserg
fuente