阻塞嵌套循环i

2024-09-30 03:22:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将以下Python生成器移植到Java Iterator

def gen_sums(blocks1, blocks2):
  for b1 in blocks1:
    for b2 in blocks2:
      for n1 in b1:
        for n2 in b2:
          yield n1 + n2

在Java版本中,接口如下所示:

public class Block {
  ...

  public Iterator<Integer> iterator() { ... }
}

public class GenSums implements Iterator<Integer> {
  private Iterator<Block> blocks1;
  private Iterator<Block> blocks2;

  ...

  @Override
  public boolean hasNext() { /* TODO */ }

  @Override
  public Integer next() { /* TODO */ }
}

…我发现很难纠正。在GenSums类中只需要存储很多状态,然后从中恢复。有没有什么“标准”方法可以在Java中实现这种迭代器?我希望避免使用第三方库。你知道吗


Tags: inforintegerjavapublicblockb2class
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:30

如果您使用的是Java8,那么您可能需要考虑生成流而不是迭代器。如果需要,可以将流转换为迭代器(使用BaseStream.iterator())。你知道吗

例如:

class Block {
    private final int[] b;

    public IntStream getBs() {
        return Arrays.stream(b);
    }
}

public IntStream generate(List<Block> block1, List<Block> block2) {
    return block1.stream()
        .flatMapToInt(b1 -> block2.stream()
            .flatMapToInt(b2 -> b1.getBs()
                .flatMap(n1 -> b2.getBs().map(n2 -> n1 + n2)));
}

如您所见,这与Python中的等价语句非常接近,for语句变成了flatMapyield变成了map。你知道吗

相关问题 更多 >

    热门问题