Come inizializzare tutti gli elementi di un array su qualsiasi valore specifico in java


108

In C/C++abbiamo una memset()funzione che può soddisfare il mio desiderio, ma Javacome posso inizializzare tutti gli elementi su un valore specifico? Ogni volta che scriviamo int[] array=new int[10];, questo inizializza semplicemente un array di dimensione 10 con tutti gli elementi uguali a zero. Voglio solo cambiare questo intero di inizializzazione per uno dei miei array. cioè voglio inizializzare un array che ha tutti gli elementi uguali a -1. Altrimenti devo mettere un forciclo subito dopo l'inizializzazione, che va da indice 0a indice size-1e all'interno di quel ciclo, sto assegnando l'elemento a -1. Di seguito è riportato il codice per una maggiore comprensione-

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

Sto andando corretto? C'è un altro modo per lo stesso?

Risposte:


212

Se è un tipo primitivo, puoi usare Arrays.fill():

Arrays.fill(array, -1);

[ Per inciso, memsetin C o C ++ è utile solo per array di char. ]


17
Ho controllato il codice sorgente di Arrays.fill(). Fa la stessa 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ì. Come dovrebbe essere. Anche se sospetto che la JIT potrebbe essere abbastanza intelligente da migliorare l'implementazione di base.
Louis Wasserman

1
Non sono d'accordo. memsetpuò anche essere utilizzato, ed in effetti è molto utile, in array di interi quando è necessario riempire con 0o -1, ad esempio, in problemi DP.
Sнаđошƒаӽ

@ Sнаđошƒаӽ - Non in modo portatile.
Oliver Charlesworth

1
Solo un FYI: puoi usare memset_pattern4, 8 e 16 per altre dimensioni intere.
geowar


5

È anche possibile con i flussi Java 8:

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

Tuttavia, probabilmente non è il modo più efficiente per svolgere il lavoro.


Questo funzionerebbe anche per i tipi non primitivi ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), quindi è più flessibile di Arrays.fill (). Non sono sicuro dell'efficienza, però, come dici tu.
Christopher Riches

3

Puoi farlo se è breve:

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

ma questo diventa un male per più di pochi.

Più facile sarebbe un forciclo:

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

Modifica: mi piace anche l' Arrays.fill()opzione menzionata da altre persone.


c'è qualche disposizione per inizializzare un array bidimensionale? qualcosa come int a [] [] = new int [3] [4]; Arrays.fill (a, -1); in modo che tutti i 12 elementi vengano impostati con -1.
PoornaChandra



0

Puoi usare Arrays.fill(array, -1).


0

Evidentemente puoi usare Arrays.fill (), ma funziona anche il modo in cui lo hai fatto.


Ya. Anche Arrays.fill()utilizza un forciclo con indice 0a size-1. Allo stesso modo, quello che ho fatto. La ringrazio per la risposta.
Ravi Joshi

0

Utilizzo di Java 8, si può utilizzare semplicemente ncopiesdi Collectionsclasse:

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

Nel tuo caso sarà:

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

Ecco una risposta dettagliata di un tuo caso simile.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.