49

我想要一个包含 1 到 500 范围内的整数的列表。有没有办法使用 Guava(或纯 Java)创建这个列表,而不必遍历范围并在我自己的范围内单独添加值代码?

4

4 回答 4

127

新的 Java 8 方式:

List<Integer> range = IntStream.range(1, 501).boxed().collect(Collectors.toList());
于 2014-05-15T10:05:57.580 回答
14

使用 Guava,您可以使用Rangehttps ://guava.dev/releases/19.0/api/docs/com/google/common/collect/Range.html

当然,您的代码中仍然会有循环,但为了简单起见,它们可能会从代码中隐藏起来。

例如:

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

查看https://github.com/google/guava/wiki/RangesExplained以获取更多示例。

请记住,如果您确实需要最终迭代Range,您不能直接这样做,只能通过使用DiscreteDomains.integers().

于 2013-05-23T10:14:04.690 回答
1

顺便提一句。如果它只是用于某种迭代,你可以简单地创建一个实现Iterable接口的基本类,完全跳过插入。

像这样的东西:

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

可以以这样的方式使用:

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

for (int i : range) {
    // ... do something with the integer
}
于 2018-03-11T15:11:43.140 回答
0

您还可以使用 Apache Commons IntRange实用程序

例如

    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;
}
于 2019-02-20T14:15:08.710 回答