【问题标题】:Using Line2D in java with hashmaps在 Java 中使用带有哈希图的 Line2D
【发布时间】:2014-09-03 03:04:46
【问题描述】:

我有一组 N 个点,我想找出单行中的最大点数。

我用每对点创建了 Line2D 对象。显然,一些 Line2D 对象将具有相同的斜率和截距以使点共线。现在我想创建一种哈希表来存储具有相同斜率和截距的线的计数器。

        int x1 = 1;
        int y1 = 1;
        int x2 = 2;
        int y2 = 2;
        int x3 = 3;
        int y3 = 3;


        Line2D line1 = new Line2D.Double(x1, y1, x2, y2);
        Line2D line2 = new Line2D.Double(x2, y2, x3, y3);


        hashMap.put(line1, 1);

显然,如果我将 line2 放在 hashMap 中,它将转到另一个。我怎样才能做到这一点,因为两条线都相同,所以计数增加 1?

【问题讨论】:

标签: java hashmap


【解决方案1】:

您可以创建一个包含斜率和截距值的新类。它应该有一个 equals 方法和 hashcode 方法,允许在定义的参数 epsilon 值内进行等价,以允许功能浮点相等。然后你可以使用它作为 HashMap 的键。该值将是您的 Line2D 或点对的 ArrayList。

【讨论】:

  • 我想知道这个“epsilon-equality”应该怎么做。 equals 方法必须是可传递的。但是在引入 epsilon(暂时忽略 hashCode)时,您可能会有 A=0.4、B=0.5、C=0.6 之类的点。使用 0.1 的 epsilon,您将有 A==B 和 B==C,但不是 A==C ...(但也许我在这里误解了一些东西...)
【解决方案2】:

您可以使用 String key 并将每个坐标/点附加到字符串,这样当您放置相同的坐标时,它不会将其放到 HashMap 中的单独位置。

样本:

Line2D line1 = new Line2D.Double(x1, y1, x2, y2);
HashMap<String, Integer> hashMap = new HashMap<>();
String keyToGetOrPut = line1.getP1().getX() + "" + line1.getP1().getY() + "" + line1.getP2().getX() + "" + line1.getP2().getY();
if(hashMap.get(keyToGetOrPut) != null){
    hashMap.put(keyToGetOrPut, hashMap.get(keyToGet)+1); //increment by 1 if points is already in the HashMap
} else {
    hashMap.put(keyToGetOrPut, 1); //put a new record to the HashMap
}

【讨论】:

  • keyToGet 字符串不应该在值之间进行分隔吗?例如,line1.getP1().getX() + " " + line1.getP1().getY()line1.getP1().getX() + "-" + line1.getP1().getY()
  • @Cyber​​neticTwerkGuruOrc 不需要,它仅用作唯一键,添加空格或破折号不会改变任何内容。
  • 假设您有line1(1.23, 4.5, 6.7, 8.9)line2(1.2, 34.5, 6.7, 8.9),它们不会产生相同的值(尽管它们是两条不同的行)?
  • @Cyber​​neticTwerkGuruOrc 他们不会产生相同的值。 getX()getY() 将返回 double 而不是 int。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2011-04-10
  • 2011-07-14
  • 2015-12-21
相关资源
最近更新 更多