Was ist der beste Weg, Min- und Max-Wert aus einer Liste von Vergleichsdaten zu erhalten, die Hauptnullwerte enthalten?

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

  •  21-08-2019
  •  | 
  •  

Frage

Ich denke an so etwas wie folgt aus:

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();
}

Aber nicht null ist sicher, das etwas, was ich auch will, ist.

Sie wissen, einen besseren Weg, dieses Problem zu lösen?

EDIT:

Nach den Kommentaren habe ich auch versucht 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;  
            }
        }});
}

Was halten Sie davon?

War es hilfreich?

Lösung

Andere Tipps

Wenn Sie wirklich „null“ müssen ausgeschlossen werden aus dem Ergebnis, und man kann es nicht sein in Ihrem Array verhindern, dann sollten Sie vielleicht nur mit einer einfachen Schleife durch das Array durchlaufen und verfolgen die „min“ und „max“ in separaten Variablen. Sie können immer noch die „vergleichen ()“ Methode für jedes Objekt verwenden Sie es mit Ihrer aktuellen „min“ zu vergleichen und „max“ Werten. Auf diese Weise können Sie Ihre eigenen Code für die Überprüfung für NULL-Werte hinzufügen, und ignorieren sie.

EDIT: Hier ist etwas Code zu veranschaulichen, was ich rede. Leider gibt es eine Kante Fall, dass Sie berücksichtigen müssen - was ist, wenn alle der übergebenen Argumente in null sind? Was ist Ihre Methode zurückgeben?

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;
}

Sie nicht Comparable implementieren null zu akzeptieren, da sie die Schnittstelle des Vertrag bricht.

https://docs.oracle. com / JavaSE / 7 / docs / api / java / lang / Comparable.html :

  

Beachten Sie, dass null nicht eine Instanz einer Klasse ist, und e.compareTo (null) eine Nullpointer sogar falsch obwohl e.equals (null) zurück werfen sollte.

Sie müssen stattdessen eine neue Schnittstelle erstellen, zum Beispiel ComparableNull statt.

Siehe auch:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top