3

これについて頭を悩ませてきました-そして、それは単純だと思いますが、私の幾何学/代数はかなりゴミであり、学生時代からこのことを行う方法を思い出せません!

編集済み:私は人々が立っている座標のリストを持っています-リスト(配列)で左上から右下に人を並べるアルゴリズムが必要です.2番目の基準は、左上の原点に近い座標が取ることを要求します他のすべてよりも優勢 - どのようにこれを行いますか?

コードは次のように順序を表示する必要があります。

  1. トム
  2. ハリー
  3. ボブ
  4. デイブ

以下の図を参照してください。

代替テキスト

4

6 に答える 6

8

あなたの注文から、x 位置よりも y 位置を優先しているように見えるので、2 人を比較する場合は次のようになります。

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() を実行できるようになります。ここで、負の値は最初の人が 2 番目の人より前であることを意味します。

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)
于 2009-05-27T14:51:36.913 に答える
2

2D 空間の左上隅からの距離 (この場合は 0, 100) に基づいて並べ替えます。

編集:

明らかに、これは 2 人の人物が左上隅から等距離にあるにもかかわらず、互いに近くにいない場合があることを意味します。

この場合、そのような人を注文する方法を指定する必要があります。上の人を選びたい場合は、最初にy座標で注文できます。同様に、他の基準を選択することもできます。

他のすべてのソートアルゴリズムには、2 つのアイテムが同じソートキーを持つ場合にどうするかという同じ問題があります。定義上、2 番目の並べ替え基準を考え出すまで、それらは同一と見なされます。

于 2009-05-27T14:52:07.850 に答える
1

X の最大桁数がわかっている場合は、(特定の例で) 100 * (100 - Y) + X で並べ替えます。

于 2009-05-27T14:52:00.953 に答える
0

コンパレータは次のようになります。

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

これは、最初に Y で並べ替え、次に X で並べ替えます (同じ Y を持つすべてのオブジェクトに対して)。

[編集] Y ソート順を修正しました。

于 2009-05-27T14:52:42.870 に答える
-3

ナビゲーションで 2 点からの近接度を計算するために使用される Haversine 式を調べることができるかもしれません。ただし、これは主に球上の点に当てはまります。 http://en.wikipedia.org/wiki/Haversine_formula

于 2009-05-27T14:53:54.290 に答える