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


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()вариант, упомянутый другими людьми.


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



0

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


0

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


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);
.

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.