Я хотел бы иметь список, который содержит целые числа в диапазоне от 1 до 500. Есть ли способ создать этот список, используя Гуава (или просто Java) без необходимости циклически перебирать диапазон и добавлять значения по отдельности в моем собственном код?
Заполнение списка с непрерывным диапазоном целых чисел
Ответ 1
Используя Guava, вы можете прибегнуть к Range
: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html
Конечно, в вашем коде все равно будут циклы, но они просто могут быть скрыты от кода для простоты.
Например:
Range<Integer> yourValues = Range.closed(1, 500);
Посмотрите http://code.google.com/p/guava-libraries/wiki/RangesExplained на несколько примеров.
Имейте в виду, что если вам нужно в конечном итоге перебрать Range
, вы не сможете сделать это напрямую, только используя DiscreteDomains.integers()
.
Ответ 2
Новый, Java 8, способ:
List<Integer> range = IntStream.range(0, 500).boxed().collect(Collectors.toList());
Ответ 3
Btw. если он используется только в какой-то итерации, вы можете просто создать базовый класс, который реализует интерфейс 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
}
Ответ 4
Вы также можете использовать утилиту 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;
}