web-dev-qa-db-fra.com

façon la plus rapide de remplir un tableau avec 1,2 ... n

Y at-il quelque chose d'aussi rapide que cela en Java? (codage rapide) 

int [] a = {1..99};

ou je dois y aller pour ça:

int [] a=new int[100];
for (int i=0;i <100;++i){
a[i]=i;
}
26
C graphics

Par curiosité, j'ai testé les performances de deux versions de cette méthode - l'une avec une boucle et l'autre en goyave:

public int[] loop() {
    int[] a = new int[100];
    for (int i = 0; i < 100; ++i) {
        a[i] = i;
    }
    return a;
}

public int[] guava() {
    Set<Integer> set = ContiguousSet.create(Range.closed(0, 99), DiscreteDomains.integers());
    int[] a = Ints.toArray(set);
    return a;
}

Voici les résultats:

Benchmark     Mean     Mean error          Var    Units
guava      814.753         46.359     2034.726  nsec/op
loop        79.913          5.671       30.447  nsec/op

La première méthode fonctionne donc en 814 ns +/- 46ns contre 80 ns +/- 5ns pour la seconde. Donc, la boucle est environ 10 fois plus rapide. Si vous appelez cette méthode plusieurs fois, les 800 nanosecondes importent peu. Si vous l’appelez très souvent, l’écriture de la boucle est probablement meilleure.

13
assylias

Depuis Java 8 c'est possible:

int[] a = IntStream.range(1, 100).toArray();

(Et plus court que l’autre réponse Java 8.).

59
Bachi

Java 8 permet de faire cela en une ligne avec l'objet IntStream et l'expression lambda:

int n = 10;
int[] values = new int[n];
IntStream.range(1,n+1).forEach(val -> values[val-1] = val);
14
chao

Une autre alternative si vous utilisez Java 8:

int[] array = new int[100];
Arrays.setAll(array, i -> i + 1);

L'expression lambda accepte l'index de la cellule et renvoie une valeur à insérer dans cette cellule. Dans ce cas, les valeurs 1 à 100 sont attribuées aux cellules 0 à 99.

8
Manos Nikolaidis

en fonction de la taille que vous devrez boucler, si c'est un petit, vous pouvez faire ce qui suit ...

int[] intArray = new int[] {4,5,6,7,8};

je devine pour votre taille, vous ne voulez pas avoir à taper le tout, il est donc logique de créer une boucle et le définir de cette façon

1
Andy B

Vous devez utiliser loop pour initialiser un tableau aussi long. Il n'y a pas de méthode de raccourci en Java comme prévu. 

0
Nobal

Vous pouvez utiliser la bibliothèque Guava pour quelque chose comme ceci:

public class Test {

public static void main(String[] args) {
    //one liner
    int[] array = toArray(newLinkedList(concat(range(1, 10), range(500, 1000))));

    //more readable
    Iterable<Integer> values = concat(range(1, 10), range(500, 1000));
    List<Integer> list = newLinkedList(values);
    int[] array = toArray(list);

}

public static List<Integer> range(int min, int max) {
    List<Integer> list = newLinkedList();
    for (int i = min; i <= max; i++) {
        list.add(i);
    }

    return list;
}

}

Updated: les exemples complets sont tirés de cet article Remplissez les tableaux avec des plages de nombres

0
evgenyl

Je pense que votre code est le le plus court et le le plus simple moyen. Vous n'aurez peut-être pas besoin de charger des bibliothèques supplémentaires pour obtenir des lignes de code plus "compactes". Les boucles pour sont très simples (vraiment O(n)) et lisibles , les vivent et les aiment.