ストリームでJava 8ネストされたループ

鉛:

私は、反復処理を行うループを持っていますInteger [][]map現在、このようなものです:

for(int i = 0; i < rows; i++) {
    for(int j = 0; j < columns; j++) {
        if(map[i][j] == 1)
            q.add(new Point(i,j));
    }
}        

代わりに、2次元配列の、私が持っていると仮定List<List<Integer>> maps2dどのように私はストリームにそれを行うのでしょうか?

これまでのところ、私はこれを得ました:

maps2d.stream()
      .forEach(maps1d -> maps1d.stream()
                               .filter(u -> u == 1)
                               .forEach(u -> {

                               }
      )
);

それは今のところ正しいですか?そうならば、どのように私は数えないij作成するために、new Point(i,j)およびに追加しますかq

なスロー:

あなたが本当に同じ目的のためにストリームを使用したい場合は、1つのオプションは、ネストされた使用することであるIntStreamインデックスを反復するために秒。例として:

public static List<Point> foo(List<List<Integer>> map) {
  return IntStream.range(0, map.size()) // IntStream
      .mapToObj(
          i ->
              IntStream.range(0, map.get(i).size())
                  .filter(j -> map.get(i).get(j) == 1)
                  .mapToObj(j -> new Point(i, j))) // Stream<Stream<Point>>
      .flatMap(Function.identity()) // Stream<Point>
      .collect(Collectors.toList()); // List<Point>
}

個人的に、私は途方もなく読みを見つけることができません。あなたはまだあなたの現在のソリューションに似てあなたのリストを持つループ、ネストされたために使用することもできます。

public static List<Point> foo(List<List<Integer>> map) {
  List<Point> result = new ArrayList<>();
  for (int i = 0; i < map.size(); i++) {
    List<Integer> inner = map.get(i);
    for (int j = 0; j < inner.size(); j++) {
      if (inner.get(j) == 1) {
        result.add(new Point(i, j));
      }
    }
  }
  return result;
}

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=440374&siteId=1