我有一个列表,我想在i-1
,i
和i+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
个条目,你会怎么做?
答案 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
}