2014-12-19 2 views
0

나는 으로 변경할 수 있지만 Set으로 변경할 수 없습니다. 여기에 문제가 있습니다 :Java Set - 이름 목록을 기준으로 정렬하는 방법

나는 이름, 타워, 자동차, 건물, 사무실, 지하실 있습니다. 각 인스턴스에 대해 이들 중 하나를 포함하는 문자열 레이블 변수가있는 POJO가 있습니다.

어떻게 이들을 타워, 자동차, 건물, 사무실, 지하실의 정확한 순서로 정렬 할 수 있습니까? 코스 (그 세트)에 허용되는 복제본은 없습니다.

public class Places{ 

String label; 
int moreinfo; 
} 

그래서 10 곳을 상상 타워, 자동차, 빌딩, 사무실의 수 레이블, 개체 지하실 : 나는 그들이 "의 정확한 순서에 있는지 확인하기 위해 일련의 이러한를 정렬 할 수있는 방법 타워, 자동차, 빌딩, 사무실, 지하실 "?

+1

'Comparable '을 구현하기 위해'장소 '를 수정하십시오. –

답변

0

당신은 문자열의 임의의 집합에 대한 주문을 정의하는지도를 사용할 수 있습니다

private static Map<String, Integer> ordering; 
static { 
    ordering = new HashMap<>(); 
    ordering.add("tower", 1); 
    ordering.add("car", 2"); 
    ...add your other strings with increasing values... 
} 

Collections.sort(yourCollection, new Comparator<Places>() { 
    public int compare(Places p1, Places p2) { 
     return ordering.get(p1.label) - ordering.get(p2.label); 
    } 
}); 

조심, 그러나 ... 당신이 세트를 정렬 할 수 없습니다. SortedSet (TreeSet와 같은)의 경우, 순서가 정의되어 있지 않은 경우는 소트됩니다.

+0

추신 : 당연히 Java 8을 사용하는 경우 람다를 사용하여 컴파일러를 만들 수 있습니다. –

+0

Thanks @JeffreyBosboom, fixed. –

1

'label'필드를 열거 형으로 설정하여 열거 형 값이 사용자 지정 순서에 따라 정렬되도록 할 수 있습니다.

public enum Label { 
    TOWER, CAR, BUILDING, OFFICE, BASEMENT 
} 

그런 다음 세트를 정렬하기 위해 비교 항목을 구현할 수 있습니다.

class Places implements Comparable<Places>{ 

    Label label; 
    int moreinfo; 
    @Override 
    public int compareTo(Places o) { 
     return label.compareTo(o.label); 
    } 
} 

그런 다음 Collections.sort 메서드를 사용하여 정렬 할 수 있습니다.

+0

창조적 인 대답이지만 내 구현을 변경할 수 없습니다. 레이블은 내 코드의 String입니다. 하나 추가. – j2emanue

관련 문제