문제

이것에 대해 내 머리를 쫓아 내고 있습니다. 그리고 나는 그것이 단순하다고 생각하지만 내 기하학/대수는 꽤 쓰레기이며, 학교 시절 부터이 일을하는 방법을 기억할 수 없습니다!

편집 : 사람들과 좌표 목록이 있습니다. 목록 (배열)의 왼쪽에서 오른쪽에서 오른쪽으로 사람들을 주문할 수있는 알고리즘이 필요하며, 두 번째 기준은 왼쪽 원산지에 더 가깝게 조정하는 조정을 요구합니다. 다른 모든 것에 대한 프리 센던스 - 어떻게 이렇게 하시겠습니까?

코드는 순서를 다음과 같이 표시해야합니다.

  1. 괴롭히다
  2. 단발
  3. 데이브

아래 다이어그램을 참조하십시오.

alt text

도움이 되었습니까?

해결책

주문에서 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)

다른 팁

이 경우 (0, 100) 2D 공간의 왼쪽 상단 모서리에서 거리를 기준으로 주문하십시오.

편집하다:

분명히 이것은 당신이 두 사람이 왼쪽 상단에서 등거리가있는 경우가 있지만 서로 가까이있는 경우가 있음을 의미합니다.

이 경우 그러한 사람들을 주문하기를 원하는 방법을 지정해야합니다. 더 높은 사람들을 선택하려면 먼저 Y 코드로 주문할 수 있습니다. 마찬가지로 다른 기준을 선택할 수 있습니다.

다른 모든 분류 알고리즘은 2 개의 항목이 동일한 정렬 키를 가질 때 수행해야 할 일에 대해 동일한 문제가됩니다. 정의상, 그들은 ~이다 보조 정렬 기준을 제시 할 때까지 동일한 것으로 간주됩니다.

말하고 싶습니다 :

orderValue = x+(100-y)

그런 다음 가장 작은 순서 값을 "가장 가까운"(y = 100-x에 선에 투사 된 거리에 따라)를 왼쪽 상단으로 정렬하십시오.

x의 최대 순서를 알고 있다면 (주어진 예제) 100 * (100 -y) + x를 정렬하십시오.

비교기는 다음과 같습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top