2009-05-27 91 views
3

一直在为此感到头疼 - 我认为它很简单,但我的几何/代数是非常垃圾的,我不记得如何从我的学校时间做这些东西!订购坐标问题

编辑: 我有一个与他们站在一起的人的坐标列表 - 我需要一个算法来从左上角到右下角排列列表(数组),第二个标准要求坐标更接近左上角的起源是对所有其他人的尊重 - 你会如何做到这一点?

的代码应该显示顺序:

  1. 汤姆
  2. 哈利
  3. 鲍勃
  4. 戴夫
下面

见下图:

alt text

+0

其实我在上面描述的问题中看不到任何与几何有关的东西。起初我想过极坐标,但在你的问题简单的排序买y和x将是一个解决方案。 – Roman 2009-05-27 15:01:04

+0

如果鲍勃在(60,74)时会怎么样?如果鲍勃或哈利第一? – user101884 2009-05-27 15:04:11

回答

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(),其中负指的第一人是前第二:如果你知道的最大订单

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

而不是“更大”,你应该说“之前”。内置的Java排序例程按升序排序,所以说“更大”是令人困惑的。但至少你在y维上得到了正确的比较,所以+1。 – erickson 2009-05-27 15:12:27

+0

固定,谢谢(15个字符) – 2009-05-27 15:31:44

+0

要挑选一个尼特,`a.x-b.x`可能会溢出 - 只需使用`a.x greybeard 2016-01-25 12:42:15

1

(按照给定的例子)排序100 *(100 - Y)+ X

2

根据它们距离二维空间左上角的距离对它们进行排序,在这种情况下(0, 100)。

编辑:

显然,这将意味着你将有地方2人都是从左上角等距离的情况下,但他们都远不及对方。

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

所有其他排序算法都会有同样的问题,当2个项目具有相同的排序关键字时,该做什么。根据定义,然后,他们认为相同,直到你想出一个二级分类标准。

0

比较如下:

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

这将在前排序Y,然后通过X(对于具有相同的Y所有对象)。

[编辑]固定Y排序顺序。

1

我说:

orderValue = x+(100-y) 

然后排序基于最小orderValue为“最接近”(根据投射到直线y = 100-x中的距离)到左上。