Как инициализировать все элементы массива любым конкретным значением в 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;
    }

Я иду правильно? Есть ли другой способ сделать то же самое?

Рави Джоши
источник

Ответы:

213

Если это примитивный тип, вы можете использовать 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.
Sнаđошƒаӽ 03
@ Sнаđошƒаӽ - Не переносным способом.
Оливер Чарльзуорт,
1
Просто к сведению: вы можете использовать memset_pattern4, 8 и 16 для других целочисленных размеров.
geowar
32

Есть также

int[] array = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
Жильбер Ле Блан
источник
12
Что делать, если размер массива неизвестен?
Абхишек Кумар
5

Это также возможно с потоками Java 8:

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

Однако, вероятно, это не самый эффективный способ выполнить работу.

Алексей
источник
Это также будет работать для непримитивных типов ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), поэтому более гибко, чем Arrays.fill (). Хотя, как вы говорите, не уверен в эффективности.
Christopher Riches
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()вариант, упомянутый другими людьми.

Danation
источник
есть ли возможность инициализировать двумерный массив? что-то вроде int a [] [] = new int [3] [4]; Arrays.fill (a, -1); так что все 12 элементов будут установлены с -1.
PoornaChandra 08
1

Вы пробовали функцию Arrays.fill ?

Сэм Голдберг
источник
Нет. Раньше не пользовался.
Рави Джоши
Не могли бы вы также привести пример, как это могло бы выглядеть?
Aenadon
@Aenadon: см. Принятый ответ, в котором показана функция Arrays.fill.
Сэм Голдберг
0

Вы можете использовать Arrays.fill(array, -1).


источник
0

Очевидно, вы можете использовать Arrays.fill (), но то, как вы это сделали, также работает.

Renuz
источник
Ya. Даже 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);
.

Вот подробный ответ вашего подобного случая.

hd84335
источник
0

Для списков вы можете использовать

Collections.fill(arrayList, "-")

Мохан Мунисифредди
источник