2016-06-21 18 views
-1

Aktuelles Ergebnis zu sein, ist: [-50.0, -40.0, -30.0, -20.0, -10.0, 0.0, null, null, null, null]}Wie kann ich die Null-Werte erhalten die ersten aufsteigend sortieren und umgekehrt

Erwartetes Ergebnis: [null, null, null, null, -50.0, -40.0, -30.0, -20.0, -10.0, 0.0]}

Above-Code ist für die Werte Sortierung in Aufsteigende Reihenfolge.

Für die Werte Descending ordnen etwas wie wenn diese

[0.0, -10.0, -20.0, -30.0, -40.0, -50.0, null, null, null, null]

Mein Doppelkomparator aussehen sollte

private Comparator<Object[]> createDoubleComparator(boolean ascendingSort, boolean isDstSort) 
    { 
     if (ascendingSort) 
     { 
       return new Comparator<Object[]>() { 
        public int compare(Object[] o1, Object[] o2) { 
         if (o1[0] == null && o2[0] == null) return 0; 
         if (o1[0] == null) return -1; 
         if (o2[0] == null) return 1; 
         Double lhs = (Double) o1[0]; 
         Double rhs = (Double) o2[0]; 
         return lhs.compareTo(rhs); 
        } 
       }; 
     } 
     else 
     {  return new Comparator<Object[]>() { 
        public int compare(Object[] o1, Object[] o2) { 
         if (o1[0] == null && o2[0] == null) return 0; 
         if (o1[0] == null) return 1; 
         if (o2[0] == null) return -1; 
         Double lhs = (Double) o1[0]; 
         Double rhs = (Double) o2[0]; 
         return rhs.compareTo(lhs); 
        } 
       }; 
      } 
     } 
    } 
+2

Was für diese Doppel ist der Behälter? So wie es jetzt aussieht, vergleichen Sie Objekt-Arrays. Ich denke nicht, dass das richtig ist. Bitte zeigen Sie mehr von Ihrem Code. –

+0

Werfen Sie einen Blick auf die [Comparator.nullsFirst] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#nullsFirst-java.util.Comparator-) (und die andere handliche Vergleicher, zB [comparingDouble] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparingDouble-java.util.function.ToDoubleFunction-)) – Hulk

+0

ja ein Array von Objekten. 'result = doSort (d.Values, 0.0, t.values, valueDefault, createDoubleComparator (incresentSort, isDstSort));'. wo'd.values' und 't.values' sind Array für Objekte. –

Antwort

0

ohne wirklich zu verstehen, warum Sie vergleichen Object [] finden hilft ... Hinweis 3 verschiedene Möglichkeiten, es zu tun, 3. ist

Comparator<Double> dComp = Comparator.nullsFirst(Comparator.naturalOrder()); 

+

import java.util.Arrays; 
import java.util.Comparator; 
import java.util.List; 

public class ComparatorTest { 

    public static void main(String[] args) { 
     List<Double> dArr = Arrays.asList(40.0, null, 10.0, 20.0, 50.0, 30.0, null, 70.0, null, 60.0); 

     // (1) Old school Anonymous class style sort 
     dArr.sort(new Comparator<Double>() { 
      @Override 
      public int compare(Double o1, Double o2) { 
       if(o1 == null && o2 == null) return 0; 
       else if(o1 == null) return -1; 
       else if(o2 == null) return 1; 
       else return o1.compareTo(o2); 
      } 
     }); 

     // (2) An even better Java 8 Lambda sort approach 
     dArr.sort((o1, o2) -> { 
      if(o1 == null && o2 == null) return 0; 
      else if(o1 == null) return -1; 
      else if(o2 == null) return 1; 
      else return Double.compare(o1, o2); 
     }); 

     // (3) You can create and RETURN a very simple Comparator this way 
     Comparator<Double> dComp = Comparator.nullsFirst(Comparator.naturalOrder()); 

     dArr.sort(dComp); 

     System.out.print(dArr); 
    } 

} 
+1

Macht es einen Unterschied, wenn ich Object [] verwende? Ich habe das schon versucht, aber es hilft mir nicht, das erwartete Ergebnis zu bekommen. –

+0

Versuchen Sie zwei Objekt-Arrays zu vergleichen? Es sieht so aus, als würden Sie die einzelnen Doubles in einem einzigen Array vergleichen, daher macht der Vergleich von Object [] keinen Sinn. –

+0

Ich habe den Code für meinen Doppelkomparator hinzugefügt, wenn das hilft –