【问题标题】:Find maximum and minimum double value in a list在列表中查找最大和最小双精度值
【发布时间】:2019-01-14 15:10:00
【问题描述】:

我有以下双值列表:

items {9.0, 4.0, 16.0, -6.0, 5.0}

我想找到最大值和最小值,为此我做到了:

double max = items.stream().max(Comparator.comparing(String::valueOf)).get();
double min = items.stream().min(Comparator.comparing(String::valueOf)).get();

我得到的结果是max=9.0 和min=-6.0。我期望最大值为16.0。后来,我将16.0 更改为92.0 并且成功了;它给了我max=92.0

你知道怎么解决吗?

【问题讨论】:

  • 问题是你在比较字符串并且9xx总是大于1xxx。
  • 你想使用Double::valueOf,而不是String::valueOf。

标签: java java-8 java-stream comparator


【解决方案1】:

您不想使用字符串进行比较,而是通过双元素的自然顺序进行比较,即 Comparator.naturalOrder() 而不是 Comparator.comparing(String::valueOf)。

通过字符串比较将导致字符被比较,并且由于9("9.0")的字符值大于1("16.0"),您会得到您看到的结果。将"16.0" 更改为"92.0" 将导致. 与2 进行比较(因为第一个字符相等),因此"92xx" 大于"9.xx"。

【讨论】:

    【解决方案2】:

    怎么样:

    double max = items.stream().mapToDouble(Double::doubleValue).max().getAsDouble();//16.0
    double min = items.stream().mapToDouble(Double::doubleValue).min().getAsDouble();//-6.0
    

    【讨论】:

    • 这回答了确切的问题 +1。
    【解决方案3】:

    您似乎想以数字方式比较数字而不是它们的字符串表示形式,例如"16.0" < "9.0" 为 '1' < '9'

    List<Double> items = Arrays.asList(9.0, 4.0, 16.0, -6.0, 5.0);
    double max = items.stream().max(Comparator.naturalOrder()).get();
    double min = items.stream().min(Comparator.naturalOrder()).get();
    System.out.println(min + " " + max);
    

    打印

    -6.0 16.0
    

    【讨论】:

      【解决方案4】:

      有一个更适合双打的流类型。使用它,您可以在一个终端操作中获得min和max(过程中无需提供比较器):

      DoubleSummaryStatistics stats = items.stream().mapToDouble(d -> d)
       .summaryStatistics();
      //even better: DoubleStream.of(9.0, 4.0, 16.0, -6.0, 5.0).summaryStatistics()
      

      而stats 将拥有:

      count=5, sum=28.000000, min=-6.000000, average=5.600000, max=16.000000
      

      【讨论】:

      • 好,挑剔的是这不仅仅是最小和最大 - 但是是的,完全同意这个解决方案
      【解决方案5】:

      您将它们与String 进行比较,因此按字母顺序:1xx 在 9xx 之前

      然后你需要比较Double or Integer,所以使用Comparator.comparing(Double::valueOf)(或Integer::valueOf)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-09
        • 2021-07-30
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2017-09-19
        • 2020-03-07
        • 1970-01-01
        相关资源
        最近更新 更多