메인이 널 값을 포함하는 비교 가능성 목록에서 최소 및 최대 값을 얻는 가장 좋은 방법은 무엇입니까?
-
21-08-2019 - |
문제
나는 다음과 같은 것을 생각하고 있습니다.
public static <T extends Comparable<T>> T minOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.first();
}
public static <T extends Comparable<T>> T maxOf(T...ts){
SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
return set.last();
}
그러나 Null Safe는 아닙니다. 그것은 내가 원하는 것도 아닙니다.
이 문제를 해결하는 더 좋은 방법을 알고 있습니까?
편집하다:
의견을 마친 후 나는 또한 min ()을 시도했습니다.
public static <T extends Comparable<T>> T minOf(T...ts){
return Collections.min(Arrays.asList(ts), new Comparator<T>(){
public int compare(T o1, T o2) {
if(o1!=null && o2!=null){
return o1.compareTo(o2);
}else if(o1!=null){
return 1;
}else{
return -1;
}
}});
}
당신은 그것에 대해 어떻게 생각하십니까?
해결책
무슨 일이야 collections.max?
그리고 왜 당신은 널 안전에 관심이 있습니까? 널스가 컬렉션에 들어가도록 하시겠습니까?
다른 팁
결과에서 "NULL"을 실제로 제외해야하고 배열에있는 것을 방지 할 수 없다면 간단한 루프로 배열을 반복하고 "Min"및 "Max를 추적해야합니다. "별도의 변수. 각 객체의 "Compare ()"메소드를 사용하여 현재 "Min"및 "Max"값과 비교할 수 있습니다. 이렇게하면 Nulls를 확인하고 무시하기 위해 자신의 코드를 추가 할 수 있습니다.
편집 : 여기에 내가 말하는 내용을 설명하기위한 코드가 있습니다. 불행히도 고려해야 할 모서리 케이스가 있습니다. 당신의 방법은 무엇을 반환합니까?
public static <T extends Comparable<T>> T minOf(T...ts){
T min = null;
for (T t : ts) {
if (t != null && (min == null || t.compareTo(min) < 0)) {
min = t;
}
}
return min;
}
public static <T extends Comparable<T>> T maxOf(T...ts){
T max = null;
for (T t : ts) {
if (t != null && (max == null || t.compareTo(max) > 0)) {
max = t;
}
}
return max;
}
너 해서는 안됩니다 구현하다 Comparable
인터페이스의 계약을 중단하므로 NULL을 수락합니다.
에서 https://docs.oracle.com/javase/7/docs/api/java/lang/comparable.html :
NULL은 클래스의 인스턴스가 아니며 E.comPareto (NULL)는 E.Equals (NULL)가 False를 반환하더라도 NULLPOINTEREXCEPTion을 던져야합니다.
대신 새 인터페이스를 만들어야합니다 ComparableNull
대신에.
또한보십시오: