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?

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. ]


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


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.


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.


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



0

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


0

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


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.