Як ініціалізувати всі елементи масиву до будь-якого конкретного значення в java


108

У C/C++нас є memset()функція, яка може виконати моє бажання, але Javaяк я можу ініціалізувати всі елементи до певного значення? Щоразу, коли ми пишемо int[] array=new int[10];, це просто ініціалізує масив розміром 10, у якого всі елементи дорівнюють нулю. Я просто хочу змінити це ціле число ініціалізації для одного зі свого масиву. тобто я хочу ініціалізувати масив, у якого всі елементи рівні -1. В іншому випадку я повинен поставити forцикл відразу після ініціалізації, який коливається від індексу 0до індексу, size-1і всередині цього циклу, якому я призначаю елемент -1. Нижче наведено код для більш детального розуміння -

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

Я правильно йду? Чи є інший спосіб для того ж?

Відповіді:


212

Якщо це примітивний тип, ви можете використовувати Arrays.fill():

Arrays.fill(array, -1);

[ Між іншим, memsetв C або C ++ використовується реальне використання для масивів char. ]


17
Я перевірив вихідний код Arrays.fill(). Це робить те саме. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Раві Джоші

2
Так. Як має бути. Хоча я підозрюю, що JIT може бути досить розумним, щоб покращити базовий процес реалізації.
Луї Вассерман

1
Я не погоджуюсь. memsetтакож можна використовувати, і насправді це дуже корисно для цілих масивів, коли вам потрібно заповнити 0або -1, наприклад, у задачах DP.
Snađошƒаӽ

@ Snađошƒаӽ - Не на портативний спосіб.
Олівер Чарльзворт

1
Просто FYI: Ви можете використовувати memset_pattern4, 8 та 16 для інших цілих розмірів.
geowar


5

Також можливо з потоками Java 8:

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

Мабуть, не найефективніший спосіб виконати роботу.


Це також буде працювати для Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();непомітивних типів ( ), тому є більш гнучким, ніж Arrays.fill (). Не впевнений у ефективності, хоча, як ви кажете.
Крістофер Річ

3

Ви можете це зробити, якщо це коротко:

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

але це стає поганим для кількох людей.

Простіше буде forцикл:

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

Редагувати: мені також подобається Arrays.fill()варіант, який згадували інші люди.


чи є положення про ініціалізацію двовимірного масиву? щось на зразок int a [] [] = new int [3] [4]; Arrays.fill (a, -1); так що всі 12 елементів будуть встановлені з -1.
PoornaChandra



0

Можна використовувати Arrays.fill(array, -1).


0

Очевидно, ви можете використовувати Arrays.fill (), але так, як ви це зробили, також працює.


Я. Навіть Arrays.fill()використовує forцикл з індексом 0до size-1. Так само, як і я. Спасибі за вашу відповідь.
Раві Джоші

0

Використання Java 8, ви можете просто використовувати ncopiesв Collectionsкласі:

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

У вашому випадку це буде:

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

Ось детальна відповідь на подібний ваш випадок.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.