[英]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.0
和min=-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
對於雙打,有一個更合適的流類型。 使用它,您可以在一個終端操作中獲得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
您將它們按字母順序比較為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.