2017-10-06 46 views
5

字符串格式我要排序的浮點值,其是在如字符串格式提供的名單列表,排序花車/雙,它們與Comparator.comparing

"rate": "429.0", 
"rate": "129.0", 
"rate": "1129.0",... 

如果我使用Comparator.comparing (Room :: getRate),該列表將按字符串順序排序,這將是不正確的。所以我寫了下面的代碼,我將String轉換爲float,然後進行比較。

下面的代碼適合我,但它看起來很難看,有沒有更好的選擇?

stream().sorted(Comparator.comparing(Room::getRate, 
(s1, s2) -> (Float.parseFloat(s1) > Float.parseFloat(s2) ? 1 :-1))) 
.collect(Collectors.toList()); 
+0

你可以寫一個專用的比較器類,並使用它,以便排序。唯一的區別是您將在overriden方法中使用比較器類和排序邏輯。 – Jimmy

+0

是的意識到這一點,但因爲這是一個普遍的問題,希望有人可能有一個更簡單和更好的解決方案。 – Abhi

回答

8

可以更換Room::getRater -> Float.parseFloat(r.getRate()),然後它會變成:

sorted(Comparator.comparing(
     r -> Float.parseFloat(r.getRate), 
     Comparator.naturalOrder()) 

OR

Comparator.comparingDouble(r -> Double.parseDouble(r.getRate())) 
+3

比較之前,Comparator.comparingDouble(r - > Float.parseFloat(r.getRate()))'較短並且將'float'擴展爲'double'可能比將每個'float'裝箱到'Float'便宜。如果Comparator.comparingDouble(r - > Double.parseDouble(r.getRate()))結果更快,我甚至不會感到驚訝...... – Holger

+0

這對我有效! 但是,謝謝,爲什麼我們需要Comparator.naturalOrder()它沒問題也沒問題 – Abhi

+1

@Holger我以爲我寫下了:| – Eugene