モデルクラスの準備
コレクション操作の実装例を示すために、まず処理対象となるエンティティクラスを定義します。ここでは識別子と階級を持つ Agent クラスを使用します。
public class Agent {
private String codename;
private int rank;
public Agent(String codename, int rank) {
this.codename = codename;
this.rank = rank;
}
public String getCodename() { return codename; }
public void setCodename(String codename) { this.codename = codename; }
public int getRank() { return rank; }
public void setRank(int rank) { this.rank = rank; }
}
Listの実装における走査アプローチ
順序を保持する List インターフェースの実装(例: ArrayList)では、要素の格納順にアクセスするパターンが主に利用されます。
List<Agent> roster = new ArrayList<>();
roster.add(new Agent("Viper", 4));
roster.add(new Agent("Fang", 5));
roster.add(new Agent("Shadow", 6));
添字を使用した標準ループ
インデックス管理が必要な場合に適しています。ランダムアクセスが高速な実装において効率的です。
for (int idx = 0; idx < roster.size(); idx++) {
System.out.println(roster.get(idx).getCodename());
}
拡張for文(foreach)
構文が簡潔になり、可読性が向上します。単純な列挙処理では最も推奨される形式です。
for (Agent member : roster) {
System.out.println(member.getCodename() + " / Lv." + member.getRank());
}
Iteratorの適用
走査中に要素の削除を行う必要がある場合や、リスト実装の種類に関わらず統一的に処理したい場合に利用します。
Iterator<Agent> iter = roster.iterator();
while (iter.hasNext()) {
Agent current = iter.next();
System.out.println(current.getCodename() + " | " + current.getRank());
}
Setの実装における走査アプローチ
重複を許容しない Set インターフェース(例: HashSet)は、格納順序を保証しない点に注意が必要です。
Set<Agent> uniqueAgents = new HashSet<>();
uniqueAgents.add(new Agent("Viper", 4));
uniqueAgents.add(new Agent("Fang", 5));
uniqueAgents.add(new Agent("Shadow", 6));
反復処理自体は List と同様に Iterator または拡張for文で記述できます。
// Iteratorパターン
Iterator<Agent> setIter = uniqueAgents.iterator();
while (setIter.hasNext()) {
System.out.println(setIter.next().getCodename());
}
// 拡張for文パターン
for (Agent agent : uniqueAgents) {
System.out.println(agent.getCodename() + " :: " + agent.getRank());
}
Mapの実装における走査アプローチ
キーと値のペアを管理する Map インターフェース(例: HashMap)は、アクセス目的に合わせて走査戦略を選択します。
Map<String, Agent> registry = new HashMap<>();
registry.put("unit-01", new Agent("Viper", 4));
registry.put("unit-02", new Agent("Fang", 5));
registry.put("unit-03", new Agent("Shadow", 6));
エントリーセット全体をイテレート
キーと値の両方を一度に取得したい場合に最も効率的です。
Iterator<Map.Entry<String, Agent>> entryIter = registry.entrySet().iterator();
while (entryIter.hasNext()) {
Map.Entry<String, Agent> record = entryIter.next();
System.out.println(record.getKey() + " -> " + record.getValue().getCodename());
}
キーセットを介した値取得
キーのみで処理を分岐し、必要に応じて値を検索するパターンです。
for (String key : registry.keySet()) {
System.out.println(key + " : " + registry.get(key).getCodename());
}
拡張for文によるエントリー処理
大規模なデータセットを処理する際にもメモリ効率が良く、構文的に明確です。
for (Map.Entry<String, Agent> entry : registry.entrySet()) {
System.out.println(entry.getKey() + " | " + entry.getValue().getRank());
}
値のみの列挙
キーが不要な場合は values() コレクションを対象とすることで処理を最適化できます。
for (Agent agent : registry.values()) {
System.out.println("Agent: " + agent.getCodename());
}
階層型コレクションのネスト処理
コレクションを複数次元で組み合わせた構造(例: List<Map<String, Agent>>)に対しては、外側から内側へ順に反復子を適用します。
List<Map<String, Agent>> database = new ArrayList<>();
database.add(registry); // 前述のMapを追加
database.add(new HashMap<>()); // 追加データ構造
インデックス制御と拡張for文を組み合わせることで、ネストされた要素に安全にアクセスできます。
for (int tableIdx = 0; tableIdx < database.size(); tableIdx++) {
Map<String, Agent> currentTable = database.get(tableIdx);
for (Map.Entry<String, Agent> cell : currentTable.entrySet()) {
System.out.println("Table[" + tableIdx + "] Key=" + cell.getKey() +
" Value=" + cell.getValue().getCodename());
}
}