Jak zainicjować wszystkie elementy tablicy do określonej wartości w java

108

W C/C++mamy memset()funkcję, która może spełnić moje życzenie, ale w Javajaki sposób mogę zainicjować wszystkie elementy do określonej wartości? Ilekroć piszemy int[] array=new int[10];, po prostu inicjalizujemy tablicę o rozmiarze 10, w której wszystkie elementy są równe zero. Chcę tylko zmienić tę liczbę całkowitą inicjalizacyjną dla jednej z moich tablic. tj. chcę zainicjować tablicę, która ma wszystkie elementy równe -1. W przeciwnym razie fortuż po inicjalizacji muszę umieścić pętlę, która obejmuje zakres od indeksu 0do indeksu, size-1a wewnątrz tej pętli przypisuję element do -1. Poniżej znajduje się kod dla lepszego zrozumienia-

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

Czy mam rację? Czy jest na to inny sposób?

Ravi Joshi
źródło

Odpowiedzi:

212

Jeśli jest to typ prymitywny, możesz użyć Arrays.fill():

Arrays.fill(array, -1);

[ Nawiasem mówiąc, memsetw C lub C ++ ma realne zastosowanie tylko dla tablic char. ]

Oliver Charlesworth
źródło
17
Sprawdziłem kod źródłowy Arrays.fill(). Robi to samo. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi,
2
Tak. Tak jak powinno być. Chociaż podejrzewam, że JIT może być wystarczająco inteligentny, aby ulepszyć podstawową implementację.
Louis Wasserman,
1
Nie zgadzam się. memsetmoże być również używany, i faktycznie jest bardzo przydatny, w tablicach całkowitych, gdy trzeba wypełnić 0lub -1, na przykład, w problemach DP.
Sнаđошƒаӽ
@ Sнаđошƒаӽ - Nie w przenośny sposób.
Oliver Charlesworth
1
Tylko do Twojej wiadomości: możesz użyć memset_pattern4, 8 i 16 dla innych rozmiarów całkowitych.
geowar
32

Jest także

int[] array = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Gilbert Le Blanc
źródło
12
A jeśli rozmiar tablicy jest nieznany?
Abhishek kumar
5

Jest to również możliwe w przypadku strumieni Java 8:

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

Prawdopodobnie nie jest to jednak najbardziej efektywny sposób wykonywania pracy.

Alexey
źródło
To działałoby również w przypadku typów innych niż pierwotne ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), więc jest bardziej elastyczne niż Arrays.fill (). Nie jestem jednak pewien wydajności, jak powiedziałeś.
Christopher Riches
3

Możesz to zrobić, jeśli jest krótkie:

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

ale to szkodzi nie tylko kilku.

Łatwiej byłaby forpętla:

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

Edycja: Podoba mi się również Arrays.fill()opcja, o której wspominali inni ludzie.

Danation
źródło
czy są jakieś przepisy dotyczące inicjalizacji dwuwymiarowej tablicy? coś takiego jak int a [] [] = new int [3] [4]; Arrays.fill (a, -1); tak, że wszystkie 12 elementów będzie miało wartość -1.
PoornaChandra
1

Czy próbowałeś funkcji Arrays.fill ?

Sam Goldberg
źródło
Nie. Nie używałem tego wcześniej.
Ravi Joshi,
Czy mógłbyś również podać przykład, jak to mogłoby wyglądać?
Aenadon
@Aenadon: zobacz zaakceptowaną odpowiedź, która pokazuje funkcję Arrays.fill.
Sam Goldberg
0

Możesz użyć Arrays.fill(array, -1).


źródło
0

Oczywiście możesz użyć Arrays.fill (), ale sposób, w jaki to zrobiłeś, również działa.

Renuz
źródło
Ya. Nawet Arrays.fill()używa forpętli z indeksem 0do size-1. W ten sam sposób, co ja. Dziękuję za Twoją odpowiedź.
Ravi Joshi,
0

Korzystanie Java 8, wystarczy skorzystać ncopiesz Collectionsklasy:

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

W Twoim przypadku będzie to:

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

Oto szczegółowa odpowiedź na podobny twój przypadek.

hd84335
źródło
0

W przypadku list, których możesz użyć

Collections.fill(arrayList, "-")

Mohan Munisifreddy
źródło