2017-07-04 3 views
0

hier sortieren ist die Karte mit der folgenden Struktur:Wie man eine Karte von Wert in Multi-Layer

Map<String, Oddcurve> curves; 

class Oddcurve entends Curve { 
    private String curvename; 
} 

class Curve { 
    private int curveId; 
    protected Set<CurvePoint> points = new TreeSet(); 
} 

class CurvePoint { 
    private double time; 
    private double value; 
} 

Ich mag die Kurven durch die Zeit ASC sortieren und schließlich noch die gleiche Karte zurück:

Ich schreibe auf diese Weise, Wenn ich es debugge, kann ich sehen, dass die Sortierung funktioniert gut, aber schließlich gibt immer noch die ursprünglichen Kurven, ich weiß nicht warum?

proxyCurves.values().stream().forEach(curve -> curve.setPoints(curve.getPoints().stream().sorted(new ComparableComparator<>()).collect(Collectors.toSet()))); 
+0

Sie können eine Karte auf den Werten sortieren. Sie können es nur auf den Schlüsseln sortieren. – markbernard

+0

Sie sollten gültige Code-Snippets bereitstellen (siehe [MCVE] (https://stackoverflow.com/help/mcve)), um zu demonstrieren, was Sie haben und was Sie versucht haben. Das obige würde nicht so funktionieren, wie es ist, da 'CurvePoint' nicht 'Vergleichbar' implementiert, es kann nicht zu 'Punkten' hinzugefügt werden. – SubOptimal

Antwort

1
  • Erstens würde ich Ihnen raten, hashCode() und equals() Methoden außer Kraft zu setzen (Sie in Probleme laufen können, weil das).
  • Zweitens würde ich empfehlen, Comparable Schnittstelle in CurvePoint Klasse zu implementieren, weil Sie TreeSet verwenden. Dann können Sie die Methode compareTo() überschreiben und Ihre Sortierweise definieren.
+0

Ja, ich schreibe diesen Weg, wenn ich es debugge, kann ich sehen, dass die Sortierung funktioniert, aber schließlich immer noch die ursprünglichen Kurven, ich weiß nicht warum? – QSY

+0

@QSY Ich sehe unten, dass Sie Ihr Problem lösen konnten, viel Glück! –

0

Dies ist der Code, den ich das Problem zu lösen verwenden:

curves.values().stream().forEach(
      curve -> { 
       final Set<CurvePoint> sortedPoints = new TreeSet<>(
         (curvePoint1, curvePoint2) -> Double.compare(curvePoint1.getTime(), curvePoint2.getTime())); 
       sortedPoints.addAll(curve.getPoints()); 
       curve.setPoints(sortedPoints); 
      }); 
Verwandte Themen