让我解释一下我的目标。
我正在尝试 1.(读取一组点(如笛卡尔计划(用户输入,并计算每个点的次数发生在输入中。2.(然后打印出每个唯一点以及它在输入中出现的次数。X 和 Y 点将表示为双精度。由于我正在练习哈希表,因此将使用哈希表来完成。3.( 我还想计算在通过覆盖 equals 方法对我尝试的点进行哈希处理时所做的比较次数。问题是我,我知道我不应该调用哈希代码,因为它是由哈希表 API 自动调用的,但我不确定要放什么。所以我做了,这是错误的。我被卡住了。这是我到目前为止的代码:
主要类:
public static void main(String[] args){
boolean e = true;
Scanner keyboard = new Scanner(System.in);
String userInput = "";
int yesOrNo = 3;
String x = "";
String y = "";
Hashtable<Integer, Point> PointTable = new Hashtable<Integer, Point>();
while(e){
System.out.println("Please enter a point to add to hash table.");
userInput = keyboard.nextLine();
x = userInput.substring(0,3);
y = userInput.substring(4,7);
Point a = new Point(new Double(x), new Double(y));
PointTable.put(a.hashCode(), a);
System.out.println("Enter another point? 0 to quit. anything else to continue");
yesOrNo = keyboard.nextInt();
if(yesOrNo == 0){
break;
}
keyboard.nextLine();
}
System.out.println(Point.count);
System.out.println(PointTable.values());
}
}
积分等级:
public class Point{
private Double x, y;
public static int count;
public Point(Double x, Double y){
this.x = x;
this.y = y;
}
public Double getX(){
return x;
}
public Double getY(){
return y;
}
public int getCount(){
return count;
}
@Override
public boolean equals(Object o) {
count++;
if (this == o)
return true;
if (!(o instanceof Point))
return false;
Point otherPoint = (Point) o;
return otherPoint.x == x && otherPoint.y == y;
}
@Override
public int hashCode(){
int hash = 7;
hash = 71 * hash + this.x.intValue();
hash = 71 * hash + this.y.intValue();
return hash;
}
}
下面是我希望输出的示例:
(3.0,2.0): 4
(1.0,4.0): 1
(5.0,7.0): 1
(1.0,3.0): 1
(4.0,5.0): 1
(1.0,2.0): 2
Number of comparisons = 8
谢谢。
为什么要将点存储在哈希表中?两个相等的点将具有相同的哈希码,并在哈希表中相互覆盖。您要存储的是一个点出现的次数。
因此,与其为哈希码保存点:
Hashtable<Integer, Point> PointTable = new Hashtable<Integer, Point>();
为点保存一个数字:
Hashtable<Point, Integer> pointTable = new Hashtable<Point, Integer>();
然后获取点的数字,递增并将其存储回哈希表(如果为 null,则插入 1(