有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java中的Line2D和hashmaps

我有一组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


共 (2) 个答案

  1. # 1 楼答案

    可以创建一个新类来保存坡度和截距值。它应该有一个equals方法和hashcode方法,允许在定义的参数epsilon值内进行等价,以允许函数浮点相等。然后你可以用它作为HashMap的键。该值将是Line2D或点对的ArrayList

  2. # 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
    }