簡體   English   中英

在列表中查找最大和最小雙精度值

[英]Find maximum and minimum double value in a list

我有以下雙精度值列表:

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.0min=-6.0 我期望最大值為16.0 后來我把16.0改成92.0就可以了; 它給了我max=92.0

你知道怎么解決嗎?

您不希望使用字符串進行比較,而是使用雙元素的自然順序進行Comparator.naturalOrder() ,即Comparator.naturalOrder()而不是Comparator.comparing(String::valueOf)

通過字符串進行比較將導致字符被比較,並且由於字符值9"9.0" )大於1"16.0" ),您將得到您看到的結果。 "16.0"更改為"92.0"將導致. 2進行比較(因為第一個字符相等),因此"92xx"大於"9.xx"

關於什么 :

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

您似乎想要以數字方式而不是字符串表示來比較數字,例如"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

對於雙打,有一個更合適的流類型。 使用它,您可以在一個終端操作中獲得minmax (無需在此過程中提供比較器):

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

您將它們按字母順序比較為String :1xx在9xx之前

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

items.stream().sorted().limit(1).collect(Colletors.toList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM