4

我有一个列表,我想获得i-1,ii+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这种方式从列表中获取条目,你会怎么做?

4

3 回答 3

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()

  • 制作一个包装索引的包装类

于 2013-08-20T11:02:05.600 回答
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() <= 2) 以停止重复元素。

于 2013-08-20T11:02:12.530 回答
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
 }
于 2013-08-20T11:14:26.780 回答