2014-10-20 1 views
0

에 비교기를 실행 : 내 ArrayList를 pAllNisType가 같음에 따라 6 개의 오브젝트 (가득요소가 나는 코드의 평화를 TreeSet의

private class NisTypeComparator implements Comparator<NisType> { 

    @Override 
    public int compare(NisType pNisType, NisType pNisType2) { 
     if (pNisType.getPrio()>pNisType2.getPrio()) 
     return 1; 
     else if (pNisType.getPrio()<pNisType2.getPrio()) 
     return -1; 
     else 
     return 0; 
    } 
    } 

:

final SortedSet<NisType> lAllNNisType = new TreeSet<NisType>(new NisTypeComparator()); 
lAllNisType.addAll(pAllNisType); // where pAllNisType is of type ArrayList<NisType> 

내 비교 클래스를 먹으 렴 및 hashCode 메소드). 이 라인이 실행 된 그럼에도 불구하고 후 :

lAllNisType.addAll(pAllNisType); 

lAllNisType 만 5 개체를 포함합니다. 0을 반환하는 비교가 하나 있습니다.이 결과로 lAllNisType에서 개체가 제거되었습니다.

나는 여기서 어떤 일이 일어나는지 알지 못합니다. 개체가 다릅니다. 내가 이렇게하면 :

final Set<NisType> lAllNisType = new HashSet<NisType>(pAllNisType); 

lAllNisType에는 6 가지 요소가 있습니다. 당신의 도움에 대한

감사

스테판

+1

그러면 'Comparator'가 'equals'및 'hashCode'와 다르게 비교됩니다. 물론 –

+0

입니다. 그게 왜 중요한가요? –

+0

그 이유는 'TreeSet'에 5 개의 요소가 있고 'HashSet'에 6 개의 요소가있는 이유입니다. –

답변

1

예,이 순서는 (명시적인 Comparator가 제공되고 있는지 여부를) 정렬 된 세트로 유지하는 것이 documented.

참고로 정확하게 작동하고 소트 세트가 Set 인터페이스를 올바르게 구현하는 경우는, equals와의 일관성이 필요합니다. equals와의 일관성에 대한 정확한 정의는 Comparable 인터페이스 또는 Comparator 인터페이스를 참조하십시오. Set 인터페이스는 equals 연산으로 정의되었지만 정렬 된 집합은 compareTo (또는 비교) 메서드를 사용하여 모든 요소 비교를 수행하기 때문입니다. , 이므로이 방법으로 동일한 것으로 간주되는 두 요소는 정렬 된 집합의 관점에서과 같습니다. 정렬 된 집합의 동작은 순서가 equals와 일치하지 않는 경우에도 잘 정의됩니다. 그것은 단지 Set 인터페이스의 일반 계약을 따르지 못합니다.

compare이 0을 반환하는 경우 두 요소는 해당 집합과 관련하여 동일하다고 간주되며 그 중 하나만 집합에서 발생할 수 있습니다. 두 개체를 모두 유지하려면 비교자를 개체간에 구분해야합니다. 2 차 주문을 통해

관련 문제