Java - 迭代列表中的每两个元素

sti*_*kos 8 java iterator

在同时处理2个元素的同时迭代列表的最佳方法是什么?

例:

List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
for(int i = 0; i < strings.size(); i++){
    String first = strings.get(i);
    String second = null;
    if(strings.size() > i + 1){
        second = strings.get(i + 1);
    }
    System.out.println("First [" + first + "] - Second [" + second + "]");
}
Run Code Online (Sandbox Code Playgroud)

结果是:

First [item 1] - Second [item 2]
First [item 2] - Second [item 3]
First [item 3] - Second [item 4]
First [item 4] - Second [null]
Run Code Online (Sandbox Code Playgroud)

我想实现:

First [item 1] - Second [item 2]
First [item 3] - Second [item 4]
Run Code Online (Sandbox Code Playgroud)

hyd*_*yde 13

只增加i2:

for(int i = 0; i < strings.size(); i += 2) {
Run Code Online (Sandbox Code Playgroud)

  • 这不能越界吗? (2认同)

Hab*_*bib 7

您需要修改和增加i第二个值,修改语句:

second = strings.get(i + 1);
Run Code Online (Sandbox Code Playgroud)

second = strings.get(++i);
Run Code Online (Sandbox Code Playgroud)

这也将增加i,因为这似乎是期望的行为.

所以你的代码是:

List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
for(int i = 0; i < strings.size(); i++){
    String first = strings.get(i);
    String second = null;
    if(strings.size() > i + 1){
        second = strings.get(++i); //Change here
    }
    System.out.println("First [" + first + "] - Second [" + second + "]");
}
Run Code Online (Sandbox Code Playgroud)

  • @hyde,我想到了,但后来决定改变最小值,为了OP的理解,我同意for循环计数器应该只在一个地方修改,因为它提供了更好的理解/可读性 (2认同)

Ben*_*n M 5

我使用Java8 BiConsumer创建了以下方法:

public static <T> void tupleIterator(Iterable<T> iterable, BiConsumer<T, T> consumer) {
    Iterator<T> it = iterable.iterator();
    if(!it.hasNext()) return;
    T first = it.next();

    while(it.hasNext()) {
        T next = it.next();
        consumer.accept(first, next);
        first = next;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样用它:

List<String> myIterable = Arrays.asList("1", "2", "3");
tupleIterator(myIterable, (obj1, obj2) -> {
    System.out.println(obj1 + " " + obj2);
});
Run Code Online (Sandbox Code Playgroud)

这将输出:

1 2
2 3
Run Code Online (Sandbox Code Playgroud)