Cómo inicializar todos los elementos de una matriz a cualquier valor específico en java

108

En C/C++tenemos memset()la función que puede cumplir con mi deseo, sino en Javacómo puedo inicializar todos los elementos a un valor específico? Siempre que escribimos int[] array=new int[10];, esto simplemente inicializa una matriz de tamaño 10 con todos los elementos iguales a cero. Solo quiero cambiar este número entero de inicialización para uno de mis arreglos. es decir, quiero inicializar una matriz que tenga todos los elementos iguales a -1. De lo contrario, tengo que poner un forbucle justo después de la inicialización, que va de índice 0a índice size-1y dentro de ese bucle, le estoy asignando un elemento -1. A continuación se muestra el código para una mayor comprensión.

    int[] array = new int[10];
    for (int i = 0; i < size; i++) {
        array[i] = -1;
    }

¿Voy correcto? ¿Hay alguna otra forma de hacer lo mismo?

Ravi Joshi
fuente

Respuestas:

212

Si es un tipo primitivo, puede usar Arrays.fill():

Arrays.fill(array, -1);

[ Por cierto, memseten C o C ++ solo tiene un uso real para matrices de char. ]

Oliver Charlesworth
fuente
17
Revisé el código fuente de Arrays.fill(). Hace la misma cosa. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi
2
Sí. Como debería ser. Aunque sospecho que el JIT podría ser lo suficientemente inteligente como para mejorar la implementación básica.
Louis Wasserman
1
Estoy en desacuerdo. memsettambién se puede utilizar, y de hecho es muy útil, en matrices de enteros cuando necesita rellenar con 0o -1, por ejemplo, en problemas de DP.
Sнаđошƒаӽ
@ Sнаđошƒаӽ - No de forma portátil.
Oliver Charlesworth
1
Solo un FYI: puede usar memset_pattern4, 8 y 16 para otros tamaños de enteros.
geowar
32

También hay

int[] array = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Gilbert Le Blanc
fuente
12
¿Qué pasa si se desconoce el tamaño de la matriz?
Abhishek kumar
5

También es posible con los flujos de Java 8:

int[] a = IntStream.generate(() -> value).limit(count).toArray();

Sin embargo, probablemente no sea la forma más eficiente de hacer el trabajo.

Alexey
fuente
Esto también funcionaría para tipos no primitivos ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), por lo que es más flexible que Arrays.fill (). Sin embargo, no estoy seguro de la eficiencia, como dices.
Christopher Riches
3

Podrías hacer esto si es corto:

int[] array = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

pero eso se vuelve malo para algunos.

Más fácil sería un forbucle:

  int[] myArray = new int[10];
  for (int i = 0; i < array.length; i++)
       myArray[i] = -1;

Editar: También me gusta la Arrays.fill()opción que otras personas han mencionado.

Danation
fuente
¿Existe alguna disposición para inicializar una matriz bidimensional? algo como int a [] [] = new int [3] [4]; Arrays.fill (a, -1); para que los 12 elementos se establezcan con -1.
PoornaChandra
1

¿Has probado la función Arrays.fill ?

Sam Goldberg
fuente
¡No! No lo usé antes.
Ravi Joshi
¿Podría también dar un ejemplo de cómo podría verse esto?
Aenadon
@Aenadon: vea la respuesta aceptada que muestra la función Arrays.fill.
Sam Goldberg
0

Puede utilizar Arrays.fill(array, -1).


fuente
0

Evidentemente, puede usar Arrays.fill (), aunque la forma en que lo ha hecho también funciona.

Renuz
fuente
Ya. Incluso Arrays.fill()usa un forbucle con index 0to size-1. De la misma manera, lo que hice. Gracias por su respuesta.
Ravi Joshi
0

Uso de Java 8, puede simplemente usar ncopiesde Collectionsclase:

Object[] arrays = Collections.nCopies(size, object).stream().toArray();

En tu caso será:

Integer[] arrays = Collections.nCopies(10, Integer.valueOf(1)).stream().toArray(Integer[]::new);
.

Aquí hay una respuesta detallada de un caso similar suyo.

hd84335
fuente
0

Para las listas que puede utilizar

Collections.fill(arrayList, "-")

Mohan Munisifreddy
fuente