【问题标题】:Iterate by two elements on a list with Java用Java迭代列表上的两个元素
【发布时间】:2020-09-03 07:59:26
【问题描述】:

我正在寻找一种方法来迭代 Java 中的两个元素

例如: 我有这个列表:{“e1”,“e2”,“e3”,“e4”}

我想在第一次迭代时得到 { "e1" , "e2" } ,第二次 { "e2" , "e3" }

我已经找到了一种使用 Python 和 itertools 执行此操作的方法,如下所示:

import itertools
from itertools import tee

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

...
for e1,e2 in pairwise(list) :
    # creating an element using e1 and e2

我知道我可以在 Java 中手动完成,但我想问是否有明确的方法可以做到这一点,谢谢您的帮助

【问题讨论】:

  • 那么为什么要使用python 标签?
  • @timgeb 我很久以前就已经在遗传算法上使用过它并且它有效
  • @timgeb 好吧,这就是我想要的,其实很抱歉写错了,我编辑了它
  • @TraianGEICU 它将在到达之前停止,例如 { e1 , e2 , e3 , e4 } : ( e1,e2) ( e2,e3 ) (e3,e4 )
  • 你必须使用你自己的迭代器来实现你自己的接口列表。 List 的实现可以是 ArrayList(或其他)的扩展,但 Iterator 你必须实现一个新的。

标签: java list loops foreach


【解决方案1】:

要完成任务,使用常规循环并在每一步返回[curent,curent+1] 列表元素就足够了。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestList
{
public static void main(String args[])
{
    ArrayList <String> l = new ArrayList(Arrays.asList("a","b","c","d"));
    List al = new TestList().iterateList(l);
    al.forEach(System.out::println);

}
public List iterateList(List l)
{

    ArrayList<String> al = new ArrayList();
    if(l==null || l.size() <= 1)
    {
        //list size should be not_null and greater then 1 : 2_fine
        return null;
    }
    for(int i=0;i<l.size()-1;i++)
    {
        String element = l.get(i)+","+l.get(i+1);
        al.add(element);
    }
    return al;
}

输出:
a,b
b,c
c,d

【讨论】:

  • 感谢您的帮助,但正如我在问题中提到的那样,我可以手动完成,但我问是否有自动的方法来完成
  • 也许使用流可能会有所增强,但据我所知,您仍然需要抓住每一步 [curr, curr+1]
  • 已更新,但主要是相同的机制,只是这次是创建一个新列表(可能不是您想要的答案,但是...)
【解决方案2】:

在Java中,就这么简单:

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = List.of("e1", "e2", "e3", "e4");
        for (int i = 0; i < list.size() - 1; i++) {
            System.out.println("(" + list.get(i) + ", " + list.get(i + 1) + ")");
        }
    }
}

输出:

(e1, e2)
(e2, e3)
(e3, e4)

【讨论】:

  • 我已经以同样的方式手动完成了,但我正在寻找一种定义的方式,无论如何谢谢你,我看到唯一的方法是手动完成
【解决方案3】:

经过多次搜索,我认为 Java 中唯一的方法是手动完成

【讨论】:

  • @vinicius de novaes 给出了另一个很好的提示。您也可以查看一下,但最终每个解决方案都假设会消耗时间,也许 less_time_sumption_solution 最适合某些用途。