鉛:
私は、反復処理を行うループを持っています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 -> {
}
)
);
それは今のところ正しいですか?そうならば、どのように私は数えないi
とj
作成するために、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;
}