一直在思考这个问题 - 我觉得它很简单,但是我的几何/代数很垃圾,我不记得我上学的时候怎么做这些东西了!
EDITED: 我有一个人们站在他们旁边的坐标列表 - 我需要一个算法来从列表(数组)中从左上角到右下角订购人员,而第二个标准要求更接近左上角的坐标占据优势所有其他人 - 你会怎么做?
代码应将订单显示为:
见下图:
答案 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