如何在 Java 中对表示为双精度的一组点进行哈希处理



让我解释一下我的目标。

我正在尝试 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(

最新更新