我有以下双精度值列表:
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
你知道如何解决吗?
答案 0 :(得分:10)
您不想使用字符串进行比较,而是按照双元素的自然顺序进行比较,即Comparator.naturalOrder()
而不是Comparator.comparing(String::valueOf)
。
通过字符串进行比较将导致对字符进行比较,并且由于9
的{{1}}的字符值大于"9.0"
的{{1}}的字符值您看到的结果。将1
更改为"16.0"
将导致"16.0"
与"92.0"
进行比较(因为第一个字符相等),因此.
大于{{1 }}。
答案 1 :(得分:5)
您似乎想用数字而不是字符串表示形式来比较数字,例如$ npx webpack
Hash: cd3bacb4d03dd9e2e456
Version: webpack 4.16.5
Time: 377ms
Built at: 08/07/2018 9:38:12 AM
Asset Size Chunks Chunk Names
main.js 971 bytes 0 [emitted] main
Entrypoint main = main.js
[0] ./src/index.js + 1 modules 201 bytes {0} [built]
| ./src/index.js 153 bytes [built]
| ./src/file1.js 48 bytes [built]
WARNING in ./src/index.js 3:12-16
"export 'var2' was not found in './file1'
为"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);
答案 2 :(得分:5)
有更适合双打的流类型。使用它,您可以在一个终端操作中获得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
答案 3 :(得分:5)
那:
<DataTemplate>
<Button x:Name="btnCalendar" Click="btnCalendar_Click" Tag="{Binding Name}">X</Button>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsDate}" Value="False">
<Setter TargetName="btnCalendar" Property="Visibility" Value="Hidden"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
答案 4 :(得分:3)
您正在将它们与String
进行比较,因此按字母顺序:1xx在9xx之前
您需要将其比较为Double or Integer
,因此请使用Comparator.comparing(Double::valueOf)
(或Integer::valueOf
)