まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step09)
問題のポイント
remove()
はキーとその値をMapから完全に消すreplace()
は既存のキーに対して値を上書きする- 両者の違いを、出力を見ながら実感せよ
まず、日本語で考えろ
- 名簿がある(会員番号 → 名前)
- 1人を削除して、もう1人の名前を修正したい。
- 削除は
remove()
、修正はreplace()
。 - コードと出力を交互に見ながら、“消えたのか、残ってるのか”を確かめろ。
コメントを書け
// Map を初期化して3件のデータを登録
// Mapの状態を出力
// remove() で会員番号2を削除し、Mapの状態を出力
// replace() で会員番号3の名前を更新し、Mapの状態を出力
コメントに従ってコードを書け
import java.util.*;
public class MapUtil {
public static void testRemoveAndReplace() {
Map<Integer, String> memberMap = new HashMap<>();
// データ登録
memberMap.put(1, "Yamada");
memberMap.put(2, "Tanaka");
memberMap.put(3, "Suzuki");
// 初期状態
System.out.println("初期状態:");
printMap(memberMap);
// 削除
memberMap.remove(2);
System.out.println("会員番号2を削除した後:");
printMap(memberMap);
// 更新
memberMap.replace(3, "Kato");
System.out.println("会員番号3の名前を更新した後:");
printMap(memberMap);
}
private static void printMap(Map<Integer, String> map) {
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " → " + entry.getValue());
}
System.out.println();
}
}
実行結果の例(順不同)
初期状態:
1 → Yamada
2 → Tanaka
3 → Suzuki
会員番号2を削除した後:
1 → Yamada
3 → Suzuki
会員番号3の名前を更新した後:
1 → Yamada
3 → Kato
コードの解説
- 最初に
put()
で3件のデータを登録。 remove(2)
によって、キー2とその値がMapから完全に消える。replace(3, "Kato")
によって、キー3の値が上書きされる(キーは残る)。printMap()
を使って段階ごとに Map の状態を出力し、変化を可視化。
つまづきやすいポイント
remove()
はそのキーを完全に消すので、その後get()
しても null が返る。replace()
は既に存在するキーにしか効かない(存在しないと何も起きない)。put()
を使っても上書きはできるが、意図が明確なら replace() を使うとコードの意味が伝わりやすい。
// tesh:
// 「値を変える」と「値を消す」は、全然ちゃうねん。
// それを知らずにコードを書いてると、データが“いつのまにかない”地獄に落ちるぞ。
//
// Mapは正直や。
// “消せ”と言えば消す。“変えろ”と言えば変える。
// おまえはその違いを、ちゃんと命令できてるか?
//
// Just keep typing, baby.
// 消すか、変えるか。コードに意志を刻め。命令に迷うな。