2014-12-25 2 views
1

가정하자 나는이 세 가지 필드를 포함하는 클래스 : java에 조건부 비교기를 만드는 방법이 있습니까?

class Component { 
    private String color; 
    private int weight; 
    private TreeSet<Component> components = new TreeSet<Component>(new CustomComparator()); 
} 

그것이 모든 구성 요소가 같은 무게가있는 경우에만 경우 자신의 색깔에 따라 TreeSet의에 구성 요소를 정렬하도록 CustomComparator을 만들 수있는 방법이 있나요 (그렇지 않으면, 그것들은 체중에 따라 그들을 분류한다), 추가적인 비교 자나 방법을 만들 필요없이?

+0

당신이 만약

new Comparator<Component>() { @Override public int compare(Component left, Component right) { int cmp = Integer.compare(left.weight, right.weight); if (cmp == 0) { cmp = left.color.compareTo(right.color); } return cmp; } }; 

또는 타사 라이브러리를 사용할 수 있는지, 구아바의 ComparisonChain이도 친절하게 정말로 '모든 구성 요소가 동일한 무게를 가진 경우에만'색상을 기준으로 정렬하고 싶습니다. 무게와 색상에 대한 두 개의 비교기를 사용하여 최상의 솔루션을 얻은 다음 조건을 확인한 후 사용하십시오. 앱 비교기. – Michal

답변

5

확실히. 자바 8 인 경우,

new Comparator<Component>() { 
    @Override public int compare(Component left, Component right) { 
    return ComparisonChain.start() 
     .compare(left.weight, right.weight) 
     .compare(left.color, right.color) 
     .result(); 
    } 
}; 

을 또는 :

Comparator.comparingInt(Component::getWeight) // must have a getter 
    .thenComparing(Component::getColor); 
+0

필자는 이것이 모든 구성 요소가 동일한 무게를 갖는 경우에만 '색상에 기반한 요구 사항'을 따르지 않는다고 생각합니다. – Michal

+0

나는 이것이 OP가 의미하는 바라고 믿습니다. –

+0

답변을 수락하면 가능합니다. 이 경우, OP는 그의 질문을 아주 잘 만들지 않았다. 그 멋진 대답은 따로하고. 나는 일반적으로 아파치 CompareToBuilder 가서 null 검사를 포함합니다. – Michal

관련 문제