web-dev-qa-db-fra.com

Remplissage d'une liste avec une plage contiguë d'entiers

J'aimerais avoir une liste qui contient les entiers compris entre 1 et 500. Y a-t-il un moyen de créer cette liste en utilisant Guava (ou tout simplement Java) sans avoir à parcourir la plage et ajouter les valeurs individuellement dans la mienne code?

36
jgm

En utilisant Guava, vous pouvez recourir à un Range: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html =

Bien sûr, il y aura toujours des boucles dans votre code, mais elles pourraient simplement être cachées du code pour des raisons de simplicité.

Par exemple:

Range<Integer> yourValues = Range.closed(1, 500);

Vérifiez http://code.google.com/p/guava-libraries/wiki/RangesExplained pour d'autres exemples.

Gardez à l'esprit que si vous avez besoin d'itérer éventuellement sur le Range, vous ne pouvez pas le faire directement, uniquement en utilisant la fonction DiscreteDomains.integers().

14
pcalcao

Le nouveau, Java 8, façon:

List<Integer> range = IntStream.range(0, 500).boxed().collect(Collectors.toList());
94
Norswap

Btw. si elle ne doit être utilisée que dans une sorte d'itération, vous pouvez simplement créer une classe de base qui implémente l'interface Iterable, pour ignorer complètement l'insertion.

Quelque chose comme ça:

import Java.util.Iterator;

public class IntegerRange implements Iterable<Integer> {
    private int start, end;

    public IntegerRange(int start, int end) {
        if (start <= end) {
            this.start = start;
            this.end = end;
        } else {
            this.start = end;
            this.end = start;
        }
    }

    @Override
    public Iterator<Integer> iterator() {
        return new IntegerRangeIterator();
    }

    private class IntegerRangeIterator implements Iterator<Integer> {
        private int current = start;

        @Override
        public boolean hasNext() {
            return current <= end;
        }

        @Override
        public Integer next() {
            return current++;
        }
    }
}

Qui pourrait être utilisé d'une manière comme celle-ci:

Iterable<Integer> range = new IntegerRange(1, 500);

for (int i : range) {
    // ... do something with the integer
}
1
Feirell

Vous pouvez également utiliser l'utilitaire Apache Commons IntRange

Par exemple.

    private List<Integer> getAllIntegerRange(Integer firstValue, Integer secondValue) {
    List<Integer> values = new ArrayList<>();
    IntRange rang = new IntRange(firstValue, secondValue);
    int[] ranges = rang.toArray();
    for (int i : ranges) {
        values.add(i);
    }
    return values;
}
0
nilesh virkar