Ada*_*min 6 java comparator java-8 java-stream
我有以下双值列表:
items {9.0, 4.0, 16.0, -6.0, 5.0}
Run Code Online (Sandbox Code Playgroud)
我想找到最大值和最小值,为此我做了:
double max = items.stream().max(Comparator.comparing(String::valueOf)).get();
double min = items.stream().min(Comparator.comparing(String::valueOf)).get();
Run Code Online (Sandbox Code Playgroud)
我得到的结果是max=9.0
和min=-6.0
.我期待最大值16.0
.后来,我换16.0
了92.0
,它起作用了; 它给了我max=92.0
你知道怎么解决这个问题吗?
Tho*_*mas 10
您不希望使用字符串进行比较,而是根据双元素的自然顺序进行比较,即Comparator.naturalOrder()
代替Comparator.comparing(String::valueOf)
.
通过字符串进行比较将导致比较字符,并且由于9
(of "9.0"
)的字符值大于1
(of "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
Run Code Online (Sandbox Code Playgroud)
看样子你要比较的编号的数字,而不是他们的字符串表示例如"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);
Run Code Online (Sandbox Code Playgroud)
版画
-6.0 16.0
Run Code Online (Sandbox Code Playgroud)
对于双打,有一个更合适的流类型.使用它,你可以得到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()
Run Code Online (Sandbox Code Playgroud)
而且stats
将有:
count=5, sum=28.000000, min=-6.000000, average=5.600000, max=16.000000
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1554 次 |
最近记录: |