在列表中查找最大和最小双值

时间:2018-08-07 13:41:48

标签: java java-8 java-stream comparator

我有以下双精度值列表:

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

你知道如何解决吗?

5 个答案:

答案 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)

有更适合双打的流类型。使用它,您可以在一个终端操作中获得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

答案 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