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

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.0min=-6.0.我期待最大值16.0.后来,我换16.092.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".


YCF*_*F_L 6

关于什么 :

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)


Pet*_*rey 5

看样子你要比较的编号的数字,而不是他们的字符串表示例如"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)


ern*_*t_k 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()
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)

  • 好的,挑剔的是,这不仅仅是最小和最大 - 但是,完全同意这个解决方案 (2认同)