完成后重启迭代器

时间:2013-08-20 10:56:09

标签: java list

我有一个列表,我想在i-1ii+1位置获取值。当i是第一个或最后一个索引时,它会抛出IndexOutOfBoundsException。为了防止这种情况,我会写一些if-statements并对其进行硬编码:

if (i == 0){
    a = list.get(list.size()-1);
    b = list.get(0);
    c = list.get(1);
} else if (i == list.size()-1){
    a = list.get(i-1);
    b = list.get(i);
    c = list.get(0);
} else {
    a = list.get(i-1);
    b = list.get(i);
    c = list.get(i+1);
}

我发现这种方式是静态的。假设我想以这种方式从列表中获取n个条目,你会怎么做?

3 个答案:

答案 0 :(得分:4)

您可以使用(i-1+list.size()) % list.size()(i+1) % list.size() 这也将处理长度为1的列表。

更重要的选项:

  • 编写方法

    <T> T get(List<T> list, int i)
    {
        i %= list.size();
        return list.get(i >= 0 ? i : i + list.size());
    }
    
  • 子类并覆盖get()

  • 创建一个包装索引

  • 的包装类

答案 1 :(得分:3)

您可以使用三元运算符稍微缩短代码,并将get调用分解为进一步缩短代码。

int prev, i, next;

//start loop here

prev = (i == 0 ? list.size()-1 : i-1);
next = (i == list.size()-1 ? 0 : i+1);

a = list.get(prev);
b = list.get(i);
c = list.get(next);

// end loop here

您必须处理小列表,(size()&lt; = 2)才能停止重复元素。

答案 2 :(得分:1)

为什么你不能只使用foreach迭代并重新分配这样的旧值:

 List<Integer> list = Arrays.asList(1, 5, 7, 3, 4);
 int n = 3;  // how much entries we take
 int a = 0, b = 0, c;
 for (int i = 0; i < n; i++) {
     c = b;
     b = a;
     a = list.get(i);
     // do some stuff
 }