一直在为此感到头疼 - 我认为它很简单,但我的几何/代数是非常垃圾的,我不记得如何从我的学校时间做这些东西!订购坐标问题
编辑: 我有一个与他们站在一起的人的坐标列表 - 我需要一个算法来从左上角到右下角排列列表(数组),第二个标准要求坐标更接近左上角的起源是对所有其他人的尊重 - 你会如何做到这一点?
的代码应该显示顺序:
- 汤姆
- 哈利
- 鲍勃
- 戴夫
见下图:
一直在为此感到头疼 - 我认为它很简单,但我的几何/代数是非常垃圾的,我不记得如何从我的学校时间做这些东西!订购坐标问题
编辑: 我有一个与他们站在一起的人的坐标列表 - 我需要一个算法来从左上角到右下角排列列表(数组),第二个标准要求坐标更接近左上角的起源是对所有其他人的尊重 - 你会如何做到这一点?
的代码应该显示顺序:
见下图:
从您的订货,它看起来像你把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(),其中负指的第一人是前第二:如果你知道的最大订单
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)
(按照给定的例子)排序100 *(100 - Y)+ X
根据它们距离二维空间左上角的距离对它们进行排序,在这种情况下(0, 100)。
编辑:
显然,这将意味着你将有地方2人都是从左上角等距离的情况下,但他们都远不及对方。
在这种情况下,您需要指定您希望如何订购此类人员。如果你想挑选更高级别的人,你可以先以y-coord命令。同样,你可以选择其他标准。
所有其他排序算法都会有同样的问题,当2个项目具有相同的排序关键字时,该做什么。根据定义,然后,他们是认为相同,直到你想出一个二级分类标准。
比较如下:
int d = o2.y - o1.y;
if (d == 0)
d = o1.x - o2.x;
return d;
这将在前排序Y,然后通过X(对于具有相同的Y所有对象)。
[编辑]固定Y排序顺序。
也许你可以看看导航中使用的Haversine公式来计算两点间的距离。但是,这主要适用于球体上的点。 http://en.wikipedia.org/wiki/Haversine_formula
我说:
orderValue = x+(100-y)
然后排序基于最小orderValue为“最接近”(根据投射到直线y = 100-x中的距离)到左上。
其实我在上面描述的问题中看不到任何与几何有关的东西。起初我想过极坐标,但在你的问题简单的排序买y和x将是一个解决方案。 – Roman 2009-05-27 15:01:04
如果鲍勃在(60,74)时会怎么样?如果鲍勃或哈利第一? – user101884 2009-05-27 15:04:11