Java 完成后重新启动迭代器

Java 完成后重新启动迭代器,java,list,Java,List,我有一个列表,我想得到I-1、I和I+1位置的值。当i是第一个或最后一个索引时,它将抛出索引outofboundsexception。为了防止出现这种情况,我会编写一些if语句,然后像这样硬编码: 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 =

我有一个列表,我想得到
I-1
I
I+1
位置的值。当
i
是第一个或最后一个索引时,它将抛出
索引outofboundsexception
。为了防止出现这种情况,我会编写一些if语句,然后像这样硬编码:

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
条目,您将如何做到这一点?

您可以使用
(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());
    }
    
    T获取(列表,int i)
    {
    i%=list.size();
    返回list.get(i>=0?i:i+list.size());
    }
    
  • 子类和重写
    get()

  • 创建一个围绕索引的包装类


您可以使用三元运算符稍微缩短代码,并考虑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()为什么不能用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
 }
List-List=Arrays.asList(1,5,7,3,4);
int n=3;//我们接受多少条目
int a=0,b=0,c;
对于(int i=0;i
我觉得这段代码可读性很强,可以理解。但它不能处理列表包含单个元素的情况。获取N个条目是什么意思?如果列表仅包含2个元素,则将分别获取第一个或第二个元素,具体取决于
i=1
i=0
代码真的很糟糕,有N个条目,我想说的是从列表中获取尽可能多的条目,一次可能是这三个,一次从I-3到I+3这不是一个真正的编码问题,对吧?这是关于你表达你想要的。简言之,如果
N=2*j+1
k=list.size()
,那么我想你想要从元素
((I-j+k)%k)
到元素
((I+j)%k)
。写你自己的代码在这两个元素之间迭代。@DavidWallace谢谢,修正了。好的,我已经删除了我的反对票。但是,你真的回答了这个问题吗?问题是“您如何从列表中获取
n
条目”。我在这里看不到答案。greate idea for(I+n)%list.size()@DavidWallace的想法是将-1和+1替换为-n和+n。看起来OP可以工作,但您必须停止一次以获取所需的三个条目。如果您希望获得第一个、第二个和最后一个条目,它将为您提供0 1 5而不是4 1 5,如果您希望将最后一个条目作为“基”,则相同“但是我想知道你怎么能用这个迭代来做别的事情,我认为它曾经是有用的!”三元运算符:非常有用,我总是忘记它