메인이 널 값을 포함하는 비교 가능성 목록에서 최소 및 최대 값을 얻는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/369383

  •  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 대신에.

또한보십시오:

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top