2017-07-04 70 views
0

這裏排序地圖是地圖結構如下:如何通過價值多層

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

我想的時候ASC曲線進行排序,最後返回仍然是相同的地圖:

proxyCurves.entrySet().stream().sorted(Comparator.comparing(Map.Entry::getValue)); 

我這樣寫,當我調試它,我可以看到排序工作正常,但最後仍然返回原始曲線,我不知道爲什麼?

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

不能排序的值的地圖。您只能按鍵進行分類。 – markbernard

+0

您應該提供有效的代碼片段(請參閱[MCVE](https://stackoverflow.com/help/mcve))以演示您擁有的內容以及您嘗試的內容。上面的代碼不會工作,因爲'CurvePoint'沒有實現'Comparable'它不能被添加到'points'。 – SubOptimal

回答

1
  • 首先,我會建議你重寫hashCode()equals() 方法(你可能會碰到因爲這個問題)。
  • 其次,我建議您在CurvePoint類中實施Comparable 接口,因爲您使用的是TreeSet。然後,您將可以覆蓋 compareTo()方法,並定義您的排序方式。
+0

是的,我這樣寫,當我調試它,我可以看到排序工作,但最後仍然返回原始曲線,我不知道爲什麼? – QSY

+0

@QSY我在下面看到你能解決你的問題,祝你好運! –

0

這是我用來解決該問題的代碼:

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