クリアとクローン
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);
// 出力: [Coddy]セットを空にするには:
set.clear();
System.out.println(set.isEmpty());
// 出力: trueclone() でキャストが必要なのはなぜですか?
プリミティブ型でのキャスト(int x = (int) 3.14 など)については、すでに学びました。同じ考え方がオブジェクトにも当てはまりますが、その理由は異なります。
clone() メソッドは、特定の HashSet<String> 型ではなく、汎用的な Object 型を返します。これは、clone() が Object クラスで定義されており、どの型を複製しているのか分からないためです。
// clone() が返すもの:
Object cloneResult = set.clone(); // HashSet<String> ではなく Object を返す
// 必要なもの:
HashSet<String> clonedSet = (HashSet<String>) set.clone(); // Object を HashSet<String> にキャストするキャストはJavaに次のように伝えます:「このObjectは実際にはHashSet<String>だと分かっているので、そのように扱ってください。」
キャストがないと、JavaはObjectをHashSet<String>に自動的に変換しないため、コンパイルエラーが発生します。
チャレンジ
簡単入力として文字列のHashSetを受け取る、processSetという名前のメソッドを作成してください。このメソッドでは、次の処理を行います。
- セットを複製します。
- 元のセットをクリアします。
- 複製したセットとそのサイズを、次の形式で出力します。
Cloned Set: [elements]Cloned Set Size: X - 元のセット(クリア後)とそのサイズを、次の形式で出力します。
Original Set after clear: [elements]Original Set Size: Y
自分で試してみよう
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);
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Javaオンラインコンパイラ