ここでは 「ファイル → ArrayList に読み込み → 一部だけ抜き出す(subList) → 別ファイルに書き出す」 という流れを、初心者向けにシンプルなコードで説明します。
Java の ArrayList では Arrays.copyOfRange の代わりに subList を使います。
実現すること(流れ)
input.txtを読み込んで ArrayList に入れるsubList(from, to)で一部だけ取り出すoutput.txtに書き出す
入力ファイル例(input.txt)
10
20
30
40
50
60
完成コード(ArrayList 版)
import java.util.*;
import java.io.*;
import java.nio.file.*;
public class ArrayListSlice {
public static void main(String[] args) {
try {
// ① ファイルを読み込んで行ごとに List<String> を取得
List<String> lines = Files.readAllLines(Paths.get("input.txt"));
// ② String → Integer に変換して ArrayList に入れる
ArrayList<Integer> list = new ArrayList<>();
for (String line : lines) {
list.add(Integer.parseInt(line));
}
// ③ subList で一部を取り出す(1〜3 → 20, 30, 40)
// subList は元リストの view(参照)なので new ArrayList で独立コピー
List<Integer> part = new ArrayList<>(list.subList(1, 4));
// ④ 書き出し用に List<String> を作成
List<String> outLines = new ArrayList<>();
for (Integer n : part) {
outLines.add(String.valueOf(n));
}
// ⑤ output.txt に書き出し
Files.write(Paths.get("output.txt"), outLines);
System.out.println("元のリスト : " + list);
System.out.println("抜き出したリスト: " + part);
System.out.println("output.txt に書き出しました!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
JavasubList の基本ルール(配列の copyOfRange とそっくり)
list.subList(from, to)
fromは「含む(inclusive)」toは「含まない(exclusive)」 ← ここ重要!- → 結果は
list[from] ~ list[to-1]
例:list.subList(1, 4)
list = [10, 20, 30, 40, 50, 60]
| | |
v v v
subList(1,4) → [20, 30, 40]
超重要:subList は “リストの一部を参照するビュー”
subList の注意点:
- 元のリストの一部を “参照” しているだけ
- 元リストを変更すると subList 側も影響する
- subList をそのまま保持したまま元リストを変更すると
ConcurrentModificationException
そのため、初心者は必ずこうするのがおすすめ:
new ArrayList<>(list.subList(from, to))
Javaこのコードでは 独立した別リスト を作っているので安全。
書き出される output.txt の中身
上の例では:
20
30
40
応用:範囲を変えるだけでいろいろできる
List<Integer> part1 = new ArrayList<>(list.subList(0, 3)); // 最初の3つ
List<Integer> part2 = new ArrayList<>(list.subList(2, list.size())); // 2以降全部
List<Integer> lastTwo = new ArrayList<>(list.subList(list.size() - 2, list.size()));
Java