2009-05-27 109 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中的距離)到左上。