ここでは 「ファイル → ArrayList に読み込み → subList で一部だけ抜き出す → 別ファイルへ書き出す」 という流れを、初心者向けにわかりやすくまとめます。
今回のゴール(文字列版)
input.txtの内容を ArrayList に読み込むsubList(from, to)を使って一部だけ取り出すoutput.txtに書き出す
入力ファイル例(input.txt)
apple
banana
cherry
orange
grape
melon
完成コード(ArrayList 版)
import java.util.*;
import java.io.*;
import java.nio.file.*;
public class ArrayListStringSlice {
public static void main(String[] args) {
try {
// ① ファイルを読み込んで行ごとの List<String> を取得
List<String> lines = Files.readAllLines(Paths.get("input.txt"));
// ② ArrayList<String> に変換(可変リストにしたいので)
ArrayList<String> list = new ArrayList<>(lines);
// ③ subList で一部を取り出す(1〜4 → banana, cherry, orange)
// subList は view なので安全のため ArrayList へコピー
List<String> part = new ArrayList<>(list.subList(1, 4));
// ④ output.txt に書き出す
Files.write(Paths.get("output.txt"), part);
System.out.println("元のリスト : " + list);
System.out.println("抜き出したリスト: " + part);
System.out.println("output.txt に書き出しました!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java出力ファイル(output.txt)
上の例では subList(1,4) なので:
banana
cherry
orange
が書き出されます。
subList のルール(配列と同じ)
list.subList(from, to) は:
- from → 含む (inclusive)
- to → 含まない (exclusive)
例:
[apple, banana, cherry, orange, grape, melon]
| | |
v v v
subList(1,4) → [banana, cherry, orange]
subList の注意(必ず知っておくべきポイント)
subList() は 元のリストの一部を参照するだけのビュー。
そのため、こういうことが起こります:
- 元のリストを変更すると subList も変わる
- subList を保持したまま元リストを変更すると
ConcurrentModificationException
→ 初心者は必ず new ArrayList<>(subList) で独立コピーするのが安全!
本コードでもこの方法を採用:
List<String> part = new ArrayList<>(list.subList(1, 4));
Java応用例:範囲を変えるだけですぐ使える
最初の3行を抜き出す
List<String> head = new ArrayList<>(list.subList(0, 3));
Java最後の2行を抜き出す
List<String> last2 = new ArrayList<>(list.subList(list.size() - 2, list.size()));
Java中央の部分だけ抜き出す
List<String> mid = new ArrayList<>(list.subList(2, 5));
Java