2016-04-02 10 views
1

Angenommen, ich habe eine Klasse:Sortieren Sammlungen mit Objekten mit Float-Wert

class Area{ 
    String id; 
    Float value; 
    int startTime; 
    int endTime; 
    Map<Integer, List<scheduleRequest>> timeSlotMap; 
} 

Ich mag den Bereich auf dem Wert sortieren, die eine Fließkommazahl ist. diese

Ich habe versucht:

class Value implements Comparator<Area>{ 

    @Override 
    public int compare(Area a1, Area a2) { 
     return (int)(a1.value-a2.value); I also tried this 
    } 
} 

Und in Haupt

Area area1=new Area(); 
    area1.value=(float) 1.0; 
    Area area2=new Area(); 
    area2.value=(float) 0.8; 
    Area area3=new Area(); 
    area3.value=(float) 0.6; 
    List<Area> list=new ArrayList<>(); 
    list.addAll(Arrays.asList(area2,area1,area3)); 
    Collections.sort(list, new Value()); 

Allerdings ist die Liste nicht sortiert.

+0

Sie setze bereich1.value dreimal. Versuchen Sie, Area2.value und area3.value zu setzen. –

+0

Ich bearbeite die Frage, siehe bitte nochmal. @ShearPlane – user6119494

+0

Nur als kurze Anmerkung, normalerweise werden Sie Float-Werte als '1.0f' anstelle von expliziten Umwandlungen' (float) 1.0' sehen. – dambros

Antwort

2

Versuchen:

Math.round(a1.value-a2.value);

Statt:

(int)(a1.value-a2.value);

0

Ihre Methode main() ändern zu

Area area1=new Area(); 
area1.value=(float) 1.0; 
Area area2=new Area(); 
area2.value=(float) 0.8; // area2 instead of area1 
Area area3=new Area(); 
area3.value=(float) 0.6; // area3 instead of area1 
List<Area> list=new ArrayList<>(); 
list.addAll(Arrays.asList(area2,area1,area3)); 
Collections.sort(list, new Value()); 
+0

Ich bearbeite die Frage. – user6119494

+0

@ user6119494 Ihre Darsteller runden das Ergebnis der Subtraktion ab. Bitte verwenden Sie 'Float.compare (float, float)' wie in der Antwort von BlackJoker erwähnt. –

0

1) Statt Comparator Implementierung implementieren Comparable

2) Sie brauchen keine Comparator auf den Aufruf zu Collections.sort passieren, nur das passieren Liste:

Collections.sort(list); 

3) Sie für NULL-Werte richtig in Ihrem compareTo() Methode t überprüfen sollten, o diese Art von Fehlern zu verhindern. Wenn a1.value oder a2.values ​​null ist, wird NullPointerException ausgelöst. Es wäre besser, im Voraus nach Null zu suchen. mit

+0

Ich bearbeite die Frage. – user6119494

+0

Warum vergleichbares anstelle von Komparator verwenden? – user6119494

+0

Wenn das Objekt Comparable ist, wird die Weitergabe eines Komparators überflüssig. Jede Art wird wissen, dass Ihr Objekt Comarable ist und rufen Sie die compareTo-Methode für Sie auf. – pczeus

0

vergleichen float, sollten Sie Float.compare(float f1,float f2) oder Float.compareTo(Float anotherFloat) verwenden:

class Value implements Comparator<Area>{ 

    @Override 
    public int compare(Area a1, Area a2) { 
     return Float.compare(a1.value.floatValue()-a2.value.floatValue()); // 
     //return a1.value.compareTo(a2.value); //or this 
    } 
} 
Verwandte Themen