2008-09-04 5 views
3

이것은 PHP 예제이지만 모든 언어의 알고리즘이 사용합니다. 제가 구체적으로하고 싶은 것은 미국과 캐나다를 위로 올려 버리는 것입니다. 다음은 간략화를 위해 단축 된 배열의 예입니다.ID (키)와 국가 (값)의 해시가 사전 순으로 정렬되어 있다고 가정하면 스택 상단에 항목을 버블 링하는 가장 좋은 방법은 무엇입니까?

array(
    0 => '-- SELECT --', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    4 => 'American Samoa', 
    5 => 'Andorra',) 

이드는 그대로 있어야합니다. -1 또는 -2로 설정하면 안타깝게도 작동하지 않습니다.

답변

1

필자의 비슷한 지름길은 캐나다의 시작 부분에 공백을 추가하고 미국 시작 부분에 공백을 두는 것입니다. 이러한 옵션을 SELECT 태그에 옵션으로 표시하면 공백은 보이지 않지만 정렬을 통해 공백이 여전히 앞에옵니다.

그러나 일부 상황에서는 다소 해킹 될 수 있습니다. Java에서해야 할 일은 StringComparator를 확장하고 미국과 캐나다 특수 사례를 만드는 compare() 메서드를 재정의 한 다음 정렬 알고리즘으로 새 비교기에서 전달하는 목록 (또는 배열)을 정렬하는 것입니다.

그러나 배열에서 관련 항목을 찾아 배열에서 제거하고 처음에 다시 추가하는 것이 더 간단 할 수도 있습니다. 배열을 다시 정렬하는 일종의 프레임 워크에 있다면 작동하지 않을 수 있습니다. 그러나 대부분의 경우 그것은 정상적으로 작동합니다.

[편집] 당신은 해시가 아니라 배열을 사용하는 것을 볼 수 있습니다 - 그래서 당신이 어떻게 정렬하는지에 달려 있습니다. 미국을 해시에 -2의 키로, 캐나다를 -1로두고 대신 ID로 정렬 할 수 있습니까? 11 년 동안 화를 내면서 PHP를 사용하지는 않았지만, 해시에 내장 된 정렬 방식을 가지고 있는지 또는 애플리케이션 수준에서 정렬 방식을 사용 하는지를 기억하지 않습니다.

6

이러한 상황에서 일반적으로하는 일은 DisplayOrder 또는 이와 유사한 필드를 별도로 추가하는 것입니다. 모든 것은 기본적으로, 예를 들어 1 ... DisplayOrder를 기준으로 정렬 한 다음 이름을 기준으로 정렬합니다. 목록에서 뭔가를 높이거나 낮추고 싶다면 정상적인 ID를 그대로 유지하면서 표시 순서를 조정할 수 있습니다.

- 케빈 페어차일드

1
$a = array(
    0 => '- select -', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    80 => 'USA' 
); 

$temp = array(); 
foreach ($a as $k => $v) { 
    $v == 'USA' 
     ? array_unshift($temp, array($k, $v)) 
     : array_push($temp, array($k, $v)); 
} 
foreach ($temp as $t) { 
    list ($k, $v) = $t; 
    echo "$k => $v\n"; 
} 

출력은이다

80 => USA 
0 => - select - 
1 => Afghanistan 
2 => Albania 
3 => Algeria 
0

사용자는 주변 항목을 "이동"으로 동일한 어레이 내의 요소들의 순서를 변경할 수 없다. 당신이 먼저 당신의 마음에 드는 아이템을 가지고 있으며, 새로운 배열을 구축 그것을 할 수있는 것은 마지막에 원래 국가 배열에서 다른 작업을 추가합니다

$countries = array(
    0 => '-- SELECT --', 
    1 => 'Afghanistan', 
    2 => 'Albania', 
    3 => 'Algeria', 
    4 => 'American Samoa', 
    5 => 'Andorra', 
    22 => 'Canada', 
    44 => 'United States',); 

# tell what should be upfront (by id) 
$favourites = array(0, 44, 22); 

# add favourites at first 
$ordered = array(); 
foreach($favourites as $id) 
{ 
    $ordered[$id] = $countries[$id]; 
} 

# add everything else 
$ordered += array_diff_assoc($countries, $ordered); 

# result 
print_r($ordered); 

Demo