2016-08-22 6 views
1

나는 다음과 같은 형식으로 TreeMap을 만들려고 오전 :TreeMap Comparator가 명령을 내리지 않고 있습니까?

TreeMap<Kenel, List<Dog>> treeMapOfKennelsAndDogs; 

각 항목은 Dogs의 연결리스트와 Kennel 개체입니다. 각각의 개집을 각각에있는 가장 오래된 개 개로 비교하여 주문하고 싶습니다.

그러나 treeMap의 순서는 내가 기대하는 바가 아니며, 개 목록에 크기 1의 개 목록이있는 경우 순서가 잘못되었습니다.

다음은 각 개에 관련된 가장 오래된 개를 찾는 코드와 비교기 논리입니다. 서비스 클래스에서

@Entity 
@Table(name = "KENNEL") 
public class Kennel { 

    //other fields 

    @OneToMany(cascade = CascadeType.MERGE, orphanRemoval = true) 
    @JoinColumn(name = "KENNEL_ID", referencedColumnName = "ID", updatable = true, insertable = true) 
    private List<Dog> dogList; 

    public DateTime getOldestDogInList() { 
     if (dogList.size() == 0) { 
      return null; } 

     Dog dog= dogList.get(0); 
     for (int i = 1; i < dogList.size(); i++) { 
      dog d = dogList.get(i); 
      if (d.getCreated().isBefore(dog.getCreated())) { 
       dog = d; 
      } 
     } 
     return dog.getCreated(); 
    } 

비교기 로직 :

Comparator<Kennel> oldestDog = new Comparator<Kennel>() { 
     @Override 
     public int compare(Kennel k1, Kennel k2) { 

      int result = k1.getOldestDogInList().compareTo(k2.getOldestDogInList()); 

      return result; 
     } 
    }; 

    TreeMap<Kennel, List<Dog>> treeMapOfKennelsAndDogs = new TreeMap<>(oldestDog);  

은 트리 맵에서 잘못된 순서를 야기 코드에서 오류가 있습니까? 서비스 클래스에서

+0

'Kenel'에 이미 'List '회원이 포함되어있는 경우 왜 'TreeMap >'이 필요합니까? 'TreeSet '을 대신 사용할 수 있습니다. – Eran

+1

실제 분류는 무엇입니까? –

+0

다른 개보다 어린 개가있는 개집은지도에서 실제로 더 일찍 나타 납니까? – java123999

답변

0

비교기 로직 :

TreeSet의은 서비스 클래스에 대해 알고하지 않습니다. 내부의 일반 유형에 대해서만 알고 있습니다.

1 sollution :

비교기 로직 TreeSet에 정렬됩니다 클래스에 있어야합니다. 클래스에 Comparator 및 ovverade compare 메소드를 구현해야합니다.

2 sollution :

설정 ComparatorTreeMap을 만들 수 있습니다.

TreeMap<Kenel, List<Dog>> treemap = new TreeMap<Kenel, List<Dog>>(new Comparator<Kenel>() { 
    public int compare(Kennel k1, Kennel k2) { 
     int result = k1.getOldestDogInList().compareTo(k2.getOldestDogInList()); 
     return result; 
    } 
}); 

관련 질문 : What is the difference between compare() and compareTo()?

+0

이 Kennel 클래스는 기존 코드이므로 변경할 수 없습니다. 이것이 내가 현재의 접근 방식을 취하는 이유입니다. – java123999

+0

@ java123999, make'Adapter pattern' :'Kennel'을 확장하고'Comparator'를 구현하는 새로운 클래스를 만듭니다. 'Comparator'를 구현하지 않고 TreeMap 자동 정렬에 성공하지 못합니다 –

+0

@ java123999, 제 질문을 편집했습니다. 동적으로 'Comparator'를 설정하여 솔루션 추가 –

0
  1. Map<K, V> 키의 논리가 V 클래스에 의존해서는 안됩니다 비교.
  2. Map에 삽입 한 후 키 인스턴스를 수정합니까? 그렇다면 문제입니다. 평등은 수표 *에만 적용됩니다.
  3. 정렬 된지도와 마찬가지로 트리 맵에 의해 유지 관리되는 순서와 명시 적 비교기가 제공되는지 여부는 equals와 일치해야합니다. (javadoc에서)