一直在爲此感到頭疼 - 我認爲它很簡單,但我的幾何/代數是非常垃圾的,我不記得如何從我的學校時間做這些東西!訂購座標問題
編輯: 我有一個與他們站在一起的人的座標列表 - 我需要一個算法來從左上角到右下角排列列表(數組),第二個標準要求座標更接近左上角的起源是對所有其他人的尊重 - 你會如何做到這一點?
的代碼應該顯示順序:
- 湯姆
- 哈利
- 鮑勃
- 戴夫
見下圖:
一直在爲此感到頭疼 - 我認爲它很簡單,但我的幾何/代數是非常垃圾的,我不記得如何從我的學校時間做這些東西!訂購座標問題
編輯: 我有一個與他們站在一起的人的座標列表 - 我需要一個算法來從左上角到右下角排列列表(數組),第二個標準要求座標更接近左上角的起源是對所有其他人的尊重 - 你會如何做到這一點?
的代碼應該顯示順序:
見下圖:
從您的訂貨,它看起來像你把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