【发布时间】:2013-05-18 15:34:18
【问题描述】:
我想要一个包含 1 到 500 范围内的整数的列表。有没有办法使用 Guava(或纯 Java)创建这个列表,而无需遍历该范围并单独添加值在我自己的代码中?
【问题讨论】:
-
无论你做什么,都会有一个循环(在你的代码或你使用的辅助方法中)。
-
(我们现在正在编辑问题以包含他们自己的答案吗?)
我想要一个包含 1 到 500 范围内的整数的列表。有没有办法使用 Guava(或纯 Java)创建这个列表,而无需遍历该范围并单独添加值在我自己的代码中?
【问题讨论】:
新的 Java 8 方式:
List<Integer> range = IntStream.range(1, 501).boxed().collect(Collectors.toList());
【讨论】:
使用 Guava,您可以求助于 Range: https://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()。
【讨论】:
ImmutableList,因为ContiguousSet 已经是一个不可变集合(ImmutableSortedSet),它的asLst() 方法返回ImmutableList 视图。跨度>
ContiguousSet 创建ImmutableList 具有无限范围(如Range.atLeast(1))会导致OutOfMemoryError。
顺便说一句。如果它只是用于某种迭代,您可以简单地创建一个实现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
}
【讨论】:
您还可以使用 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;
}
【讨论】: