2017-10-06 75 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