다음 compareTo()
과 같은 간단한 클래스에 대한 메소드를 구현 하고 있습니다 ( Collections.sort()
Java 플랫폼에서 제공하는 기타 기능 을 사용할 수 있음 ).
public class Metadata implements Comparable<Metadata> {
private String name;
private String value;
// Imagine basic constructor and accessors here
// Irrelevant parts omitted
}
이 객체 의 자연스러운 순서 는 1) 이름으로 정렬하고 2) 이름이 같은 경우 값으로 정렬 하고 싶습니다 . 두 비교는 대소 문자를 구분하지 않아야합니다. 두 필드 모두 널 (NULL) 값이 완벽하게 허용되므로이 compareTo
경우에는 깨지지 않아야합니다.
마음에 떠오르는 해결책은 다음과 같습니다 (여기서는 "guard 조항"을 사용하고 있지만 다른 사람들은 단일 리턴 포인트를 선호 할 수도 있지만 요점은 아닙니다) :
// primarily by name, secondarily by value; null-safe; case-insensitive
public int compareTo(Metadata other) {
if (this.name == null && other.name != null){
return -1;
}
else if (this.name != null && other.name == null){
return 1;
}
else if (this.name != null && other.name != null) {
int result = this.name.compareToIgnoreCase(other.name);
if (result != 0){
return result;
}
}
if (this.value == null) {
return other.value == null ? 0 : -1;
}
if (other.value == null){
return 1;
}
return this.value.compareToIgnoreCase(other.value);
}
이것이 작동하지만이 코드에 완전히 만족하지는 않습니다. 분명히 그것은 매우 복잡하지는 않지만 매우 장황하고 지루합니다.
문제는 어떻게 이것을 덜 장황하게 만들 것입니다 기능을 유지하면서 입니까? 도움이된다면 Java 표준 라이브러리 또는 Apache Commons를 참조하십시오. 이것을 조금 더 간단하게 만드는 유일한 옵션은 내 "NullSafeStringComparator"를 구현하고 두 필드를 비교하는 데 적용하는 것입니까?
편집 1-3 : 에디의 권리; 위의 "둘 다 이름이 null"인 경우 수정
허용 된 답변
물론 Java 1.6에서 2009 년에이 질문을했습니다. 당시 Eddie의 순수한 JDK 솔루션 이 제가 가장 선호하는 대답이었습니다. 나는 지금까지 (2017)까지 그것을 바꾸지 못했습니다.
도 있습니다 제 3 자 라이브러리 솔루션 2009 아파치 코 몬즈 컬렉션 하나 2013 구아바 하나 -a, 모두에 의해 게시 나-것을 나는 어떤 시점에서 선호 않았다가.
이제 Lukasz Wiktor 의 깨끗한 Java 8 솔루션을 정답으로 만들었습니다 . Java 8의 경우 분명히 선호되며 요즘에는 거의 모든 프로젝트에서 Java 8을 사용할 수 있습니다.