订购坐标问题

时间:2009-05-27 14:46:11

标签: java arrays algorithm coordinates

一直在思考这个问题 - 我觉得它很简单,但是我的几何/代数很垃圾,我不记得我上学的时候怎么做这些东西了!

EDITED: 我有一个人们站在他们旁边的坐标列表 - 我需要一个算法来从列表(数组)中从左上角到右下角订购人员,而第二个标准要求更接近左上角的坐标占据优势所有其他人 - 你会怎么做?

代码应将订单显示为:

  1. 汤姆
  2. 哈利
  3. 鲍勃
  4. 戴夫
  5. 见下图:

    alt text

6 个答案:

答案 0 :(得分:8)

根据您的订购,看起来您将y位置放在比x位置更高的优先级,所以这样的事情在比较两个人时会起作用:

if (a.y > b.y)
// a is before b
else if (a.x < b.x)
// a is before b
else
// b is before a

编辑更新 此比较仍适用于您的新标准。 Y位置仍然优先于X位置。如果Y值相等,则最靠近左上角的点将是具有较小X值的点。如果你想让你的对象成为比较器,那么将它作为比较器函数实现将允许你做ArrayList.sort(),其中negative表示第一个人在第二个人之前:

public int compareTo(person a, person b) {
    if (a.y == b.y)
       return a.x-b.x
    else
       return b.y-a.y
}

//compareTo(Tom, Harry) == -50 (tom is before harry)
//compareTo(Tom, Bob) == -25 (tom is before bob)
//compareTo(Dave, Bob) == 30 (dave is after bob)

答案 1 :(得分:2)

根据它们与2D空间左上角的距离对它们进行排序,在本例中为(0,100)。

编辑:

显然这意味着你会遇到左上角有两个人等距的情况,但他们彼此不在一起。

在这种情况下,您需要指定您希望如何订购此类人员。如果您想挑选更高级别的人,您可以先通过y-coord订购。同样,您可以选择其他一些标准。

所有其他排序算法都会遇到同样的问题,当2个项目具有相同的排序键时该怎么办。根据定义,在您提出二级排序标准之前, 被认为是相同的。

答案 2 :(得分:1)

如果您知道X的最大数量级,请按(对于您的示例)排序100 *(100 - Y)+ X.

答案 3 :(得分:1)

我会说:

orderValue = x+(100-y)

然后根据最小的orderValue进行排序,该值是最接近的(根据投射到y = 100-x的线上的距离)到左上角。

答案 4 :(得分:0)

比较器如下所示:

int d = o2.y - o1.y;
if (d == 0)
    d = o1.x - o2.x;
return d;

首先按Y排序,然后按X排序(对于所有具有相同Y的对象)。

[编辑]修正了Y排序。

答案 5 :(得分:-3)

可能您可以查看Haversine公式,该公式用于导航以计算两点的接近度。但是,这主要适用于球体上的点。 http://en.wikipedia.org/wiki/Haversine_formula