为了账号安全,请及时绑定邮箱和手机立即绑定

流最小不工作有时返回最大值而不是最小值

流最小不工作有时返回最大值而不是最小值

白衣染霜花 2019-04-19 19:15:13
import java.util.ArrayList;import java.util.Comparator;import java.util.List;import java.util.Optional;public class GetMiles {     public static void main(String args[]) {         List<Student> studentList = new ArrayList<>();         Student s = new Student();         s.setFee("12000");         studentList.add(s);         Student s1 = new Student();         s1.setFee("3000");         studentList.add(s1);         Optional<Student> optionalStudent =      studentList.stream().min(Comparator.comparing(Student::getFee));         if (optionalStudent.isPresent()) {             System.out.println(optionalStudent.get().getFee());         }     }static class Student {         private String fee;         public String getFee() {             return this.fee;         }         public void setFee(String fee) {             this.fee = fee;         }     }    }在上面的例子中它应该返回3000但是返回12000如果我们将给2000和3000它将返回2000也在大多数情况下它的工作正常但不是全部。
查看完整描述

5 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

将映射解析为列表中的int,然后像下面的示例代码一样获得最小费用:

Optional<Integer> optionalVal = studentList.stream().map(l -> Integer.parseInt(l.getFee())).min(Comparator.comparingInt(k -> k));
if(optionalVal.isPresent()) {String minFee = String.valueOf(optionalVal.get());
   Optional<Student> studentObj = studentList.stream().filter(p -> 
   minFee.equals(p.getFee())).findFirst();}


查看完整回答
反对 回复 2019-05-15
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

那是因为你使用的是String,但正如你所指定的那样,这是一个要求。所以你必须以这种方式改变流:

OptionalInt min = studentList.stream()
    .map(Student::getFee)
    .mapToInt(Integer::parseInt)
    .min();

通过这种方式,您将String转换为Int,然后您将获取最小值。

如果您的值有小数,请mapToDouble改用


查看完整回答
反对 回复 2019-05-15
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

这是因为你将它与它进行比较String。更改feeIntegerLong类型。


查看完整回答
反对 回复 2019-05-15
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

你正在比较String而不是Integer

您可以通过提供一个解决这个问题Comparator是解析String到一个Integer(或者double,如果你喜欢):

Optional<Student> opt = studentList    .stream()
    .min(Comparator.comparing(stud -> Integer.parseInt(stud.getFee())));


查看完整回答
反对 回复 2019-05-15
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您正在比较String值,您应该比较数值以获得预期结果,如doublesints。改变你的类型fee字段DoubleLongInteger

比较字符串逐个字母,所以比较300012000使3000显得更大,因为第一个字母比较31


查看完整回答
反对 回复 2019-05-15
  • 5 回答
  • 0 关注
  • 612 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信