Como inicializar todos os elementos de um array para qualquer valor específico em java


108

Em C/C++nós temos uma memset()função que pode cumprir meu desejo, mas em Javacomo posso inicializar todos os elementos com um valor específico? Sempre que escrevemos int[] array=new int[10];, isso simplesmente inicializa um array de tamanho 10 com todos os elementos iguais a zero. Eu só quero alterar este inteiro de inicialização para um dos meus array. ou seja, eu quero inicializar um array que tenha todos os elementos iguais a -1. Caso contrário, tenho que colocar um forloop logo após a inicialização, que varia de índice 0a índice size-1e dentro desse loop, estou atribuindo elemento a -1. Abaixo está o código para mais compreensão-

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

Eu estou indo correto? Existe alguma outra maneira de fazer o mesmo?

Respostas:


212

Se for um tipo primitivo, você pode usar Arrays.fill():

Arrays.fill(array, -1);

[A propósito, memsetem C ou C ++ só tem uso real para matrizes de char. ]


17
Eu verifiquei o código-fonte de Arrays.fill(). Ele faz a mesma coisa. public static void fill(int[] a, int val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; }
Ravi Joshi

2
Sim. Como deveria ser. Embora eu suspeite que o JIT pode ser inteligente o suficiente para melhorar a implementação básica.
Louis Wasserman,

1
Discordo. memsettambém pode ser usado, e de fato é muito útil, em matrizes de inteiros quando você precisa preencher 0ou -1, por exemplo, em problemas de DP.
Sнаđошƒаӽ

@ Sнаđошƒаӽ - Não de forma portátil.
Oliver Charlesworth,

1
Apenas um FYI: você pode usar memset_pattern4, 8 e 16 para outros tamanhos inteiros.
geowar


5

Também é possível com fluxos Java 8:

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

Provavelmente, não é a maneira mais eficiente de fazer o trabalho, no entanto.


Isso também funcionaria para tipos não primitivos ( Stream.generate(() -> new Whatever("Hello World", 42)).limit(count).toArray();), portanto, é mais flexível do que Arrays.fill (). Não tenho certeza sobre a eficiência, porém, como você diz.
Christopher Riches

3

Você pode fazer isso se for curto:

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

mas isso é ruim para mais do que apenas alguns.

Mais fácil seria um forloop:

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

Edit: Eu também gosto da Arrays.fill()opção que outras pessoas mencionaram.


existe alguma disposição para inicializar uma matriz bidimensional? algo como int a [] [] = new int [3] [4]; Arrays.fill (a, -1); de modo que todos os 12 elementos serão definidos com -1.
PoornaChandra



0

Você pode usar Arrays.fill(array, -1).


0

Evidentemente, você pode usar Arrays.fill (), mas a maneira como você fez isso também funciona.


Ya. Even Arrays.fill()usa um forloop com índice 0para size-1. Da mesma forma, o que eu fiz. Obrigado pela sua resposta.
Ravi Joshi,

0

Usando Java 8, você pode simplesmente usar ncopiesde Collectionsclasse:

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

No seu caso, será:

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

Aqui está uma resposta detalhada de um caso semelhante seu.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.