用一定范围的整数值初始化ArrayList避免循环

时间:2019-02-27 10:29:27

标签: java arraylist

我想用一系列整数值初始化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是不值得的。

我正在寻找效率...

3 个答案:

答案 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;
}