Algum atalho para inicializar todos os elementos da matriz para zero?

281

Em C/C++que eu costumava fazer

int arr[10] = {0};

... para inicializar todos os meus elementos da matriz para 0.

Existe um atalho semelhante em Java?

Eu quero evitar o uso do loop, é possível?

int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
    arr[i] = 0;
}
fim de jogo
fonte
2
java.util.Arrays.fill () int [] arr = novo int [10]; e int arr [10] = {0}; todos usam loops internos.
precisa saber é o seguinte

Respostas:

574

Um valor padrão de 0 para matrizes de tipos integrais é garantido pela especificação do idioma :

Cada variável de classe, variável de instância ou componente de matriz é inicializada com um valor padrão quando é criada (§15.9, §15.10) [...] Para o tipo int, o valor padrão é zero, ou seja 0,.  

Se você deseja inicializar uma matriz unidimensional com um valor diferente, pode usar java.util.Arrays.fill () (que obviamente usará um loop internamente).

Michael Borgwardt
fonte
@MichaelBorgwardt Foi uma resposta útil para mim. Teria o mesmo custo em comparação com o loop for?
maytham-ɯɐɥʇʎɐɯ
@ maytham-ɯɐɥıλɐɯ: você pode ver o código fonte, ele vem com o JDK. É exatamente o mesmo, o método consiste em nada além de um loop for perfeitamente normal e direto.
Michael Borgwardt
@MichaelBorgwardt E os valores de uma matriz bidimensional local? Isso se enquadra no "componente da matriz?"
Rishi
Arrays.fillnão necessariamente usa um loop.
Nates
@NateS: você pode dar um exemplo de implementação em Java que não?
Michael Borgwardt
104

Enquanto as outras respostas estiverem corretas (por padrão, os valores da matriz são inicializados como 0), se você desejar fazê-lo explicitamente (por exemplo, se desejar uma matriz preenchida com o valor 42), poderá usar o método fill () de a classe Arrays :

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

Ou se você é fã de 1-liners, pode usar a Collections.nCopies()rotina:

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

Daria arr o valor:

[42, 42, 42]

(embora seja Integer, e não int, se você precisar do tipo primitivo, poderá adiar a rotina do Apache CommonsArrayUtils.toPrimitive() :

int [] primarr = ArrayUtils.toPrimitive(arr);
Adam Parkin
fonte
9
One-liners são boas, mas List<Integer>para Integer[]a int[]? Isso é um pouco complicado.
dhardy
2
@ Dhardy Claro, mas é por isso que há a versão de duas linhas na resposta também (se você estiver preocupado com o fator "complicado").
Adam Parkin
inicializar a matriz 2d com o Arrays.fillmétodo está criando um problema e ocorre um erro.
AKS
39

Em java todos os elementos (tipos inteiros primitivos byte short, int, long) são inicializados como 0 por padrão. Você pode salvar o loop.

Arne Deutsch
fonte
2
Suponho que isso vale para os tipos primitivos ?!
Olimpiu POP 4/13/13
1
Tipos java primitivos, como int, não são inicializados.
Mirko Ebert
8
@ tfb785: Isso está errado. Como afirmado acima por Michael Borgwardt: tipos inteiros primitivos (abreviado, int, longo) são inicializados em 0.
Arne Deutsch
1
Sim, matriz de primitivos java como int [] são iniciadas com 0. Não, um java tipo primitivo não é iniciada com 0.
Mirko Ebert
3
Ok, para ser preciso: os membros da classe primitiva (seja estática ou não) são inicializados com 0. Variáveis ​​locais não são.
Arne Deutsch
23

Como reduz o desempenho do seu aplicativo ....? Leia a seguir.

Na especificação da linguagem Java, o valor padrão / inicial de qualquer objeto pode ser fornecido como segue.

Para o tipo byte , o valor padrão é zero , ou seja, o valor de (byte) é 0 .

Para o tipo curto , o valor padrão é zero , ou seja, o valor de (curto) é 0 .

Para o tipo int , o valor padrão é zero , ou seja, 0 .

Para o tipo long , o valor padrão é zero , ou seja, 0L .

Para tipo float , o valor padrão é zero positivo , ou seja, 0,0f .

Para o tipo double , o valor padrão é zero positivo , ou seja, 0,0d .

Para o tipo char , o valor padrão é o caractere nulo , ou seja, ' \ u0000 '.

Para o tipo booleano , o valor padrão é false .

Para todos os tipos de referência , o valor padrão é nulo .

Considerando tudo isso, você não precisa inicializar com zero valores para os elementos da matriz, porque, por padrão, todos os elementos da matriz são 0 para a matriz int.

Porque Uma matriz é um objeto de contêiner que contém um número fixo de valores de um único tipo. Agora o tipo de matriz para você é int assim que considerar o valor padrão para todos os elementos da matriz será automaticamente 0 Porque é segurando tipo int .

Agora considere a matriz para o tipo String para que todos os elementos da matriz tenham valor padrão seja nulo .

Por que não faz isso ......?

você pode atribuir valor nulo usando loop, conforme sugerido na sua pergunta.

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

Mas se você fizer isso, haverá uma perda inútil do ciclo da máquina. e se você usar em seu aplicativo onde você tem muitas matrizes e fazer isso para cada matriz, isso afetará o desempenho do aplicativo até um nível considerável.

Quanto mais uso do ciclo da máquina ==> Mais tempo para processar os dados ==> O tempo de saída aumentará significativamente . para que o processamento de dados do seu aplicativo possa ser considerado como um nível baixo (diminua a velocidade para algum nível).

Jugal Thakkar
fonte
17

Você pode salvar o loop, a inicialização já é feita para 0. Mesmo para uma variável local.

Mas, por favor, corrija o local em que você coloca os colchetes, para facilitar a leitura (prática recomendada reconhecida):

int[] arr = new int[10];
KLE
fonte
14

Se você estiver usando Flutuante ou Inteiro, poderá atribuir um valor padrão como este ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
Pankaj Goyal
fonte
6

Você pode criar uma nova matriz vazia com o tamanho da matriz existente e atribuí-las novamente à sua matriz. Isso pode ser mais rápido que o outro. Snipet:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

Resultado:

0
0
0
0
0    
0
0
0
0
Kavishankar Karunakaran
fonte
1

Sim, os valores int em uma matriz são inicializados em zero. Mas você não tem garantia disso. A documentação da Oracle afirma que essa é uma prática ruim de codificação.

nate
fonte
De acordo com a especificação Java Language, seção 15.10.2 , se uma matriz é criada com uma exceção de criação de matriz que não fornece valores iniciais, todos os elementos da matriz são inicializados com o valor padrão para o tipo de componente da matriz - ou seja, 0 no caso de char []. Isso é uma garantia; Eu ficaria surpreso se a Oracle considerasse confiar nela como uma prática ruim.
Ian Robertson
1

Os valores int já são zero após a inicialização, como todos mencionaram. Se você tem uma situação em que realmente precisa definir valores de matriz como zero e deseja otimizar isso, use System.arraycopy:

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

Isso é usado memcpysob a cobertura na maioria ou em todas as implementações do JRE. Observe que o uso de uma estática como essa é seguro, mesmo com vários threads, pois o pior caso é que vários threads sejam realocados zerossimultaneamente, o que não prejudica nada.

Você também pode usar Arrays.fillcomo alguns outros mencionaram. Arrays.fill poderia usar memcpyem uma JVM inteligente, mas provavelmente é apenas um loop Java e a verificação de limites que isso implica.

Compare suas otimizações, é claro.

NateS
fonte
1

Ainda outra abordagem usando lambda acima do java 8

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);
brahmananda Kar
fonte
1

No c / cpp, não há atalho, mas para inicializar todas as matrizes com o zero subscrito.

  int arr[10] = {0};

Mas em java existe uma ferramenta mágica chamada Arrays.fill () que preenche todos os valores em uma matriz com o número inteiro de sua escolha.

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }
Ansh Srivastava
fonte
1

A inicialização não é necessária em caso de zero, porque o valor padrão de int em Java é zero. Para valores diferentes de zero java.util.Arraysfornece várias opções, a mais simples é o método de preenchimento.

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

Também podemos usar Arrays.setAll () se desejarmos preencher valor com base na condição:

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]
Shreya Sharma
fonte
0

declare a matriz como variável de instância na classe, ou seja, fora de todo método e a JVM fornecerá 0 como valor padrão. Você não precisa mais se preocupar

Dhruvam Gupta
fonte
-3
    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

resultado 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10

Ubeyd
fonte