今回はpaiza問題集
【行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力
の問題。
nextIndexと拡張for文を学んだ。
まだ完璧には理解できなかった。
問題
自然数 N, M と N 個の自然数からなる数列 A と M 個の自然数からなる数列 B が与えられます。1 行目には数列 A の最初の B_1 個の値を出力し、 2 行目にはその次から B_2 個の値を出力します。このように、i 行目には数列 A の 1 + B_1 + B_2 + … + B_{i – 1} 番目の値から B_i 個の値を出力してください。言い換えると、数列 A の値を B_1 個、B_2個、… B_M 個で分割し、それぞれの数列を改行区切りで出力してください。
入力例
N 10
M 4
A 1 2 3 4 5 6 7 8 9 10
B 2 6 1 1
出力例
1 2
3 4 5 6 7 8
9
10
解答
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int[] b = new int[m];
for (int i = 0; i < m; i++) {
b[i] = sc.nextInt();
}
int nextIndex = 0;
for (int x : b) {
for (int i = 0; i < x; i++) {
System.out.print(a[nextIndex]);
if (i < x - 1) {
System.out.print(" ");
} else {
System.out.println();
}
nextIndex += 1;
}
}
sc.close();
}
}
- この解決策として、前回の出力でどこまで出力したか、を保持する変数を用意することが挙げられます。
- 解答コードではそれを実現するために変数
nextIndex
を用意しました。 - 変数
nextIndex
は次に出力する要素のインデックスを保持しています。 - 常に次のインデックスを示すので、出力とセットで
+1
します。 - 1 行で出力する要素の数は配列
b
が保持しているので、b
の要素に従って出力します。 - 「改行するのか」「半角スペースを入れるのか」をインデックスの値で判定して出力をします。
nextIndexの使い方
TECH .LABさんを参考
nextIndex()
次にnext()
を呼び出したときに返されることになる要素のインデックスを返します。
リスト・イテレータがリストの末尾にある場合はリストのサイズを返します。
戻り値:次にnext
を呼び出したときに返されることになる要素のインデックス。
リスト・イテレータがリストの最後にある場合はリストのサイズ
Iteratorとは
日本語で「反復子」。繰り返し処理の抽象化。
for文の場合は具体的に内容を提示する必要あるが、データの要素数がわからない場合
Iteratorを使えばループで要素を順番に取り出すことができる。
これが抽象化。
メソッドは4つ
- hasNext()
次の要素がある場合はtrueを返します。
- next()
次の要素を返します。
- remove()
最後に返された要素を削除します。
- forEachRemaining()
各要素ごとに処理を実行します。Java8から追加になっています。
ListIteratorとは
Iteratorと違いListIteratorは最後の要素から先頭にも処理が可能。
メソッドは9つ
- hasNext()
Iteratorと一緒。次の要素がある場合はtrueを返します。
- next()
Iteratorと一緒。次の要素を返します。
- remove()
Iteratorと一緒。最後に返された要素を削除します。
- add()
指定された要素をnext()で返ってきた要素の前に追加します。
- set()
データの置き換えをします。
- hasPrevious()
逆方向。次の要素がある場合はtrueを返します。
- previous()
前の要素を返します。
- nextIndex()
次にnext()を呼び出したときに返ってくる要素のインデックス。
末尾はリストのサイズ。
- previousIndex()
次にprevious()を呼び出したときに返ってくる要素のインデックス。
先頭の場合は「-1」。
nextIndex()を使うメリットがよくわからなかった。
拡張for文の使い方
JavaDriveさんを参考
対象の配列やコレクションの要素の数で繰り返しを行う数が決まる。
条件式はない。
for (データ型 変数名: コレクション){ // 繰り返しの中で実行される処理 ... }
コレクションに指定した配列やコレクションから要素を1つ取り出し変数に格納
→{}内の処理を順次実行→次の要素を取り出し変数に格納→再び{}内の処理を実行
→要素を全て取り出し終わると終了!
基本のfor文を使得こともできるが拡張for文の方が簡潔
※インデックスを順に指定して処理を行いたいときは拡張for文❌
コメント