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;
}

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


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

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.


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


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];

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

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

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.


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.


1

Ainda outra abordagem usando lambda acima do java 8

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

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

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]

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


-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

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.