我想用一系列整数值初始化ArrayList。 这就是我要避免的:
ArrayList<Integer> numbers = new ArrayList<>();
for(int i = 0; i < x; i++){
numbers.add(i);
}
我找到了IntStream的rangeClosed函数:
IntStream.rangeClosed(0, instance.getNumVertices()-1);
但是我认为转换为ArrayList是不值得的。
我正在寻找效率...
答案 0 :(得分:3)
ArrayList
由数组支持。如果要用升序值填充它,除了遍历这些值并将它们添加到列表中之外,没有比其他更快的方法了。
在您的示例中,我唯一要更改的是使用已知大小初始化数组,这样就不会花时间和内存来扩展基础数组:
ArrayList<Integer> numbers = new ArrayList<>(x);
for(int i = 0; i < x; i++){
numbers.add(i);
}
答案 1 :(得分:1)
如果您想让一个看起来像List<Integer>
的对象包含从0到N的数字而不实际存储这些数字,则可以实现自己的列表,例如:
import java.util.AbstractList;
public class RangeList extends AbstractList<Integer> {
private final int size;
public RangeList(int size) {
this.size = size;
}
@Override
public Integer get(int index) {
return index;
}
@Override
public int size() {
return size;
}
}
您可以这样创建它的实例:
List<Integer> numbers = new RangeList(10);
它的行为就像包含值0到9的标准ArrayList<Integer>
一样,但是您不能修改列表(添加,删除,修改条目将导致UnsupportedOperationException
)。
答案 2 :(得分:0)
无论您决定如何填充ArrayList,都必须一个接一个地循环或使用存储在ArrayList中的每个值。没有一种更快的方法可以遍历每个值并将其添加到ArrayList中,只有使它看起来更干净的方法。
创建这样做的函数或ArrayList对象的扩展是这样做的两种方法。
private ArrayList<Integer> fillRange(int min, int max){
ArrayList<Integer> a_lst = new ArrayList<>();
for(int i = min; i < max; i++){
a_lst.add(i);
}
return a_lst;
}