非常に具体的に行う必要があるプロジェクトがあり、助けが必要です。私は基本的にどこでも答えを探しましたが、スタックオーバーフローでも見つけることができません。ハッシュテーブルのクローン作成に関係しています。(浅いところも深いところも)
以下にコードを貼り付けましたが、要するに、Hashtable を拡張する EHashtable というクラスがあります。次に、さまざまなカスタム クラス タイプの文字列キーと値をいくつか追加します。EHashtable クラスには、Clone() および dClone() というメソッドがあります。Clone() は、その Hashtable の浅い複製を作成することになっています。つまり、Hashtable は複製されますが、その値は複製されません。dClone() は、新しい Hashtable を作成し、元のハッシュテーブルの各値をそれに複製することになっています (各値が最初のものとは異なるメモリ参照を指すことを意味します)。カスタムメイドのオブジェクトが複製可能でない場合にも、例外をスローすることになっています。
現在、浅いクローン (Clone() メソッド) でも、1 つの Hashtable の 1 つの値を変更し、もう 1 つの値は変更しません。各値が異なる参照を指しているように見えます。Clone() メソッドと dClone() メソッドに、2 つの異なる処理を実行させる方法がわかりません。もう1つ、ハッシュテーブルにはジェネリックを含めることはできません。である必要がHashtable
ありHashtable<K, V>
ます。
ハッシュテーブルを for ループする方法を調べました。これはオブジェクト型でのみ機能し、オブジェクト型はメソッドの保護ステータスのために clone() できません。以下は、メインメソッドから始まる私のコードです。これは非常に具体的であり、すべての助けに感謝します。
import java.util.Hashtable;
import java.util.Iterator;
public class _Test {
public static void main(String[] arguments) {
Circle cr1 = new Circle(1);
Circle cr2 = new Circle(2);
Point po1 = new Point(10, 10);
Point po2 = new Point(20, 20);
PlaneCircle pcr1 = new PlaneCircle(po1, 11f);
PlaneCircle pcr2 = new PlaneCircle(po2, 12f);
EHashtable eh = new EHashtable(20);
eh.add(new String("C1"), cr1);
eh.add(new String("C2"), cr2);
eh.add(new String("PC1"), pcr1);
eh.add(new String("PC2"), pcr2);
try {
EHashtable ehCloned = (EHashtable) eh.Clone();
System.out.println("/***--Before Alteration--***/");
System.out.println("eh:");
System.out.println(eh);
System.out.println();
System.out.println("ehCloned:");
System.out.println(ehCloned);
System.out.println();
Circle cr3 = new Circle(99);
Point po3 = new Point(99, 99);
PlaneCircle pcr3 = new PlaneCircle(po3, 9999f);
eh.add(new String("C1"), cr3);
eh.add(new String("PC1"), pcr3);
System.out.println("/***--After Alteration--***/");
System.out.println("eh:");
System.out.println(eh);
System.out.println();
System.out.println("ehCloned:");
System.out.println(ehCloned);
System.out.println();
}
catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
catch (ClassCastException e) {
System.out.println(e.toString());
}
catch (Exception e) {
System.out.println("\nError Message:" + e.getMessage());
}
}
}
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
public class EHashtable extends Hashtable {
public EHashtable() {
}
public EHashtable(int capacity) {
}
// Done
public boolean add(Object key, Object value) {
if (!(containsKey(key) && containsValue(value))) {
put(key, value);
return true;
}
else {
return false;
}
}
// Done
public void Clear() {
clear();
}
// Done
public Object Clone() throws CloneNotSupportedException {
EHashtable eh = (EHashtable) this.clone();
return eh;
}
public Object dClone() {
EHashtable eh = new EHashtable();
for (Object key : keySet())
eh.put(key, get(key));
return eh;
}
// Done
public boolean isNotEmpty() {
return !isEmpty();
}
// Done
public Iterator iterate() {
return entrySet().iterator();
}
}
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "[x=" + x + ", y=" + y + "]";
}
}
public class PlaneCircle {
private Point p;
private float radius;
public PlaneCircle (Point p, float radius) {
this.p = p;
this.radius = radius;
}
public String toString() {
return "[p=" + p.toString() + ", radius=" + radius + "]";
}
}
public class Circle {
private float radius;
public Circle(float radius) {
this.radius = radius;
}
public String toString() {
return "[radius=" + radius + "]";
}
}