Tout raccourci pour initialiser tous les éléments du tableau à zéro?

Dans C/C++ je faisais

int arr[10] = {0};

Pour initialiser tous mes éléments de tableau à 0.
Existe-t-il un raccourci similaire en Java?
je veux éviter d'utiliser la boucle, est-ce possible?

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;
220
demandé sur M4N 2010-01-28 14:57:14

13 réponses

Une valeur par défaut de 0 pour les tableaux de types intégraux est garantie par la spécification de langage :

Chaque variable de classe, variable d'instance ou composant de tableau est initialisée avec une valeur par défaut lors de sa création (§15.9, §15.10) [...] Pour le type int, la valeur par défaut est zéro, qui est, 0.  

Si vous souhaitez initialiser un tableau à une valeur différente, vous pouvez utiliser java.util.Tableau.fill () (qui utilisera bien sûr une boucle interne).

481
répondu Michael Borgwardt 2017-04-14 00:40:27

Alors que les autres réponses sont correctes (les valeurs int array sont par défaut initialisées à 0), si vous voulez le faire explicitement (disons par exemple si vous voulez un tableau rempli avec la valeur 42), Vous pouvez utiliser la méthode fill () de la classeArrays :

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

, Ou si vous êtes un fan de la 1-liners, vous pouvez utiliser le Collections.nCopies() routine:

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

Donnerait à arr la valeur:

[42, 42, 42]

(bien que ce soit Integer, et non int, Si vous avez besoin du type primitif, vous pouvez reporter le Apache Commons ArrayUtils.toPrimitive() routine:

int [] primarr = ArrayUtils.toPrimitive(arr);
72
répondu Adam Parkin 2015-06-18 15:00:43

En java, tous les éléments sont initialisés à 0 par défaut. Vous pouvez enregistrer la boucle.

32
répondu Arne Deutsch 2010-01-28 11:58:23

Comment cela réduit les performances de votre application....? Lire La Suite.

Dans la spécification du langage Java, la valeur par défaut / initiale pour tout objet peut être donnée comme suit.

De type byte, le valeur par défaut est zéro, c'est la valeur de (byte) est 0.

De type court - , le valeur par défaut est zéro, c'est la valeur de (court-circuit) 0.

Pour le type int, Le valeur par défaut est zéro, c'est-à, 0.

De type long, le valeur par défaut est zéro, qui est, 0L.

De type float, le valeur par défaut est positif zéro, qui est, 0.0 f.

De type double - , le valeur par défaut est positif zéro, qui est, 0.0 d.

De type char, le valeur par défaut est le null caractère, c'est-à-dire '\u0000'.

De type boolean, le valeur par défaut est false.

Pour tous les types de référence, le valeur par défaut est null.

En considérant tout cela, vous n'avez pas besoin d'initialiser avec des valeurs nulles pour les éléments du tableau car par défaut tous les éléments du tableau sont 0 pour le tableau int.

, Car Un matrice est un objet conteneur qui contient un nombre fixe de valeurs d'un type unique. Maintenant, le type de tableau pour vous est int alors considérez la valeur par défaut pour tous les éléments de tableau sera automatiquement 0 car il est contenant le type int.

Maintenant envisager le matrice pour type de Chaîne, de sorte que tous les éléments du tableau a valeur par défaut est null.

Pourquoi ne pas faire ça?.....?

Vous pouvez attribuer une valeur null en utilisant loop comme vous le suggérez dans votre Question.

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

Mais si vous ne donc, il sera une perte inutile du cycle de la machine. et si vous utilisez dans votre application où vous avez beaucoup de tableaux et que vous le faites pour chaque tableau, cela affectera les performances de l'Application jusqu'à un niveau considérable.

Le plus utiliser de machine cycle ==> Plus de temps pour traiter les données = = > temps de sortie sera considérablement augmenter . de sorte que le traitement de vos données d'application peut être considéré comme un niveau bas(lent-à un certain niveau).

16
répondu Jugal Thakkar 2013-06-04 06:32:58

, Vous pouvez enregistrer la boucle, l'initialisation est déjà à 0. Même pour une variable locale.

Mais veuillez corriger l'endroit où vous placez les crochets, pour plus de lisibilité (meilleure pratique reconnue):

int[] arr = new int[10];
14
répondu KLE 2010-01-28 12:02:47

Si vous utilisez Float ou Integer, vous pouvez attribuer une valeur par défaut comme ceci ...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
12
répondu Pankaj Goyal 2013-12-11 13:38:48

Vous pouvez créer un nouveau tableau vide avec la taille de votre tableau existant, et vous pouvez les attribuer à votre tableau. Cela peut plus vite que les autres. 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);
    }
}
}

Résultat :

0
0
0
0
0    
0
0
0
0
5
répondu Kavishankar Karunakaran 2016-07-08 07:06:21

Oui, les valeurs int d'un tableau sont initialisées à zéro. Mais vous n'êtes pas garanti cela. La documentation Oracle indique qu'il s'agit d'une mauvaise pratique de codage.

1
répondu nate 2016-04-08 01:26:47

Les valeurs int sont déjà nulles après l'initialisation, comme tout le monde l'a mentionné. Si vous avez une situation où vous avez réellement besoin de définir les valeurs du tableau à zéro et que vous voulez optimiser cela, utilisez 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);

Cela utilise memcpy sous les couvertures dans la plupart ou toutes les implémentations JRE. Notez que l'utilisation d'un statique comme celui-ci est sûre même avec plusieurs threads, car le pire des cas est que plusieurs threads réallouent zeros simultanément, ce qui ne fait rien de mal.

Vous pouvez également utiliser Arrays.fill comme d'autres l'ont mentionné. Arrays.fill pourrait utiliser memcpy dans une JVM intelligente, mais est probablement juste une boucle Java et la vérification des limites que cela implique.

Benchmark vos optimisations, bien sûr.

1
répondu NateS 2017-06-21 09:55:38

Encore une autre approche en utilisant lambda au-dessus de java 8

 Arrays.stream(new Integer[nodelist.size()]).map(e -> 
 Integer.MAX_VALUE).toArray(Integer[]::new);
1
répondu brahmananda Kar 2017-08-12 07:35:44

Déclarez le tableau comme variable d'instance dans la classe, c'est-à-dire hors de chaque méthode et JVM lui donnera 0 comme valeur par défaut. Vous n'avez plus besoin de vous inquiéter

0
répondu Dhruvam Gupta 2016-02-22 14:14:22

En c / cpp, il n'y a pas de raccourci mais pour initialiser tous les tableaux avec l'indice zéro.Ex:

  int arr[10] = {0};

Mais en java il y a un outil magique appelé tableaux.fill() qui remplira toutes les valeurs d'un tableau avec l'entier de votre choix.Ex:

  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));
   }
 }
0
répondu Ansh Srivastava 2018-07-12 06:36:53
    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();               
    }

Résultat 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10

-2
répondu Ubeyd 2016-10-30 20:03:31