2011-08-19 2 views
1

내 코드에서 Java Comparator를 사용하여 정렬하고 있습니다. 어떻게 특정 값으로 정렬 할 수 있습니까? 예를 들어 값의 범위는 1에서 1000까지 (기본값은 1000)입니다.하지만 오름차순으로 정렬하려면 1,2,3,4,5,1000 ...을 표시하고 내림차순으로 정렬하면됩니다. 정렬하려면 5,4,3,2,1,1000 .... 어떻게해야합니까? 감사합니다,정렬을 위해 Java Comparator를 사용하여 특정 값을 무시하는 방법

데이비드

+0

어떤 값을 "무시"해야합니까? –

+0

이 경우에는 1000을 무시해야합니다. –

+0

예, 실행시 결정되는 방법은 무엇입니까? –

답변

5

아래의 비교기는 값 1000을 다른 모든 것보다 "큰"것으로 항상 취급합니다. 1000은 항상 마지막으로 정렬됩니다. 다른 값은 오름차순 또는 내림차순으로 정렬됩니다.

class AscendingComp implements Comparator<Integer> 
{ 
    @Override 
    public int compare(Integer o1, Integer o2) 
    { 
     if (o1.equals(o2)) return 0; 
     if (o1.equals(1000)) return 1; 
     if (o2.equals(1000)) return -1; 
     return o1.compareTo(o2); 
    } 
} 
class DescendingComp implements Comparator<Integer> 
{ 
    @Override 
    public int compare(Integer o1, Integer o2) 
    { 
     if (o1.equals(o2)) return 0; 
     if (o1.equals(1000)) return 1; 
     if (o2.equals(1000)) return -1; 
     return o2.compareTo(o1); 
    } 
} 

편집 : 이것은 일반적인 솔루션이 아니라, 특정 질문에 응답합니다. 일반적인 솔루션에서는 일치하지 않는 비교 결과를 반환하지 않도록 특히 equals()compare() 계약에주의해야합니다. 예를 들어 조심스럽지 않고 우연히 돌아 오지 않으면 +1을 compare(a,b)compare(b,a)으로 말하면 정렬이 무한 루프가 될 수 있습니다.

+0

1000을 하드 코딩하는 대신' ignoredValues ​​'를 설정하면이 기능을 향상시킬 수 있지만이 방법이 정말 마음에 듭니다. 내 자신보다 훨씬 적응력이 좋아. – corsiKa

+0

'1000'이 고정되어 있고 항목의 최대 값이 아니라면 좋습니다. –

+1

예, 이것은 훨씬 더 일반적 일 수 있지만, SO 방법의 일부는 OP를 올바른 방향으로 향하게하고 솔루션을 상황에 맞게 적용하여 배우게하는 것입니다. –

0

왜 상승에 의해 다음 내림차순으로하지 정렬 할 않습니다. 그리고 결과를 List에 추가 할 수 있습니까?

또는 내부에 상태가 있고 마지막 항목에 도달하면 방향을 전환하는 Iterator을 구현할 수 있습니다.

0

첫 번째 목록에서 정렬하지 않을 값과 두 번째로 정렬 할 값을 저장하십시오. 두 번째 목록을 정렬하고 두 번째 목록의 첫 번째 목록에서 모든 항목을 추가하여 전체 목록을 다시 작성하십시오.

0

여기에 하나의 wya가 있습니다. 비효율적 인 구조를 사용하고 있습니다. LinkedLists가 아닌 다른 것들로 더 잘 할 수 있습니다!

관련 문제