クリアとクローン
CoddyのJavaジャーニー「ロジックとフロー」セクションの一部 — レッスン 27/59。
clear() メソッドは HashSet からすべての要素を削除し、空にします。
clone() メソッドは HashSet のシャローコピー(要素自体はクローンされません)を返します。
例えば、まず HashSet を作成します:
HashSet<String> set = new HashSet<>();
set.add("Coddy");セットをクローンするには:
HashSet<String> clonedSet = (HashSet<String>) set.clone();
System.out.println(clonedSet);
// Output: [Coddy]セットをクリアするには:
set.clear();
System.out.println(set.isEmpty());
// Output: trueなぜ clone() でキャストが必要なのか?
あなたはすでにプリミティブ型でのキャスト(例: int x = (int) 3.14)について学びました。オブジェクトにも同じ概念が適用されますが、理由は異なります。
clone() メソッドは、特定の HashSet<String> ではなく、汎用の Object 型を返します。これは、clone() が Object クラスで定義されており、クローンしている型を知らないためです。
// What clone() returns:
Object cloneResult = set.clone(); // Returns Object, not HashSet<String>
// What we need:
HashSet<String> clonedSet = (HashSet<String>) set.clone(); // Cast Object → HashSet<String>キャストは Java に伝えます:「この Object は実際には HashSet<String> なので、それをそのように扱ってください。」
キャストがないと、コンパイルエラーが発生します。なぜなら Java は Object を HashSet<String> に自動的に変換しないからです。
チャレンジ
簡単<strong>processSet</strong> という名前のメソッドを作成してください。このメソッドは String の HashSet を入力として受け取ります。メソッドは以下を行うべきです:
- セットをクローンする。
- 元のセットをクリアする。
- クローンされたセットとそのサイズを次の形式で出力する:
Cloned Set: [elements]Cloned Set Size: X - クリア後の元のセットとそのサイズを次の形式で出力する:
Original Set after clear: [elements]Original Set Size: Y
チートシート
clear() メソッドは HashSet からすべての要素を削除します:
set.clear();clone() メソッドは HashSet の浅いコピーを返します:
HashSet<String> clonedSet = (HashSet<String>) set.clone();キャストが必要な理由: clone() メソッドは汎用的な Object 型を返すため、特定の型として使用するには HashSet<String> にキャストする必要があります。
使用例:
HashSet<String> set = new HashSet<>();
set.add("Coddy");
// Clone the set (cast Object → HashSet<String>)
HashSet<String> clonedSet = (HashSet<String>) set.clone();
// Clear original set
set.clear();
System.out.println(set.isEmpty()); // Output: true
System.out.println(clonedSet); // Output: [Coddy] (clone unaffected)自分で試してみよう
import java.util.HashSet;
import java.util.Scanner;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
@SuppressWarnings("unchecked")
public class Main {
public static void processSet(HashSet<String> set) {
// ここにコードを記述してください
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String setString = scanner.nextLine();
Type setType = new TypeToken<HashSet<String>>(){}.getType();
HashSet<String> set = new Gson().fromJson(setString, setType);
processSet(set);
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。