我有一个项目需要非常具体地完成,我需要一些帮助。我基本上到处都在寻找答案,但找不到它,甚至在 Stack Overflow 上也找不到。它与克隆哈希表有关。(既浅又深。)
我已经粘贴了下面的代码,但简而言之,我有一个名为 EHashtable 的类,它扩展了 Hashtable。然后我添加了一些字符串键和各种自定义类类型的值。在 EHashtable 类中,有称为 Clone() 和 dClone() 的方法。Clone() 应该创建其 Hashtable 的浅表克隆 - 这意味着 Hashtable 被克隆但它的值不是。dClone() 应该创建一个新的哈希表并将每个原始哈希表的值克隆到它(意味着每个值指向不同的内存引用而不是第一个)。如果自定义对象不可克隆,它也应该抛出异常。
现在,即使在浅克隆(Clone() 方法)上,也会更改一个 Hashtable 中的一个值,而不会更改另一个 Hashtable 中的值。似乎每个值都指向不同的引用。我不明白如何让 Clone() 和 dClone() 方法做我希望他们做的两件不同的事情。另一件事,哈希表不能有泛型。它需要是Hashtable
而不是Hashtable<K, V>
。
我已经查找了如何循环遍历哈希表。这仅适用于 Object 类型,并且由于方法的受保护状态,Object 类型无法 clone()。下面是我的代码,从 main 方法开始。我意识到这是非常具体的,非常感谢所有帮助。
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 + "]";
}
}