请将下面的列表从小到大排序。
数组输入:[-100、50、0、56.6、90、0.12、0.12、02.34、000.000]
我的代码:
import java.math.BigDecimal;
import java.util.*;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n + 2];
for (int i = 0; i < n; i++) {
s[i] = sc.next();
}
sc.close();
List <String> k = new ArrayList <> ();
for (int i = 0; i < s.length - 2; i++) {
k.add(s[i]);
}
Collections.sort(k, Collections.reverseOrder());
k.toArray(s);
for (int i = 0; i < n; i++) {
System.out.println(s[i]);
}
}
}
我写了上面的代码,但我得到这个结果。
我的输出:[90、56.6、50、02.34、000.000、0.12、0、.12、-100]
预期的结果是这样的。
预期值:[90、56.6、50、02.34、0.12、.12、0、000.000、-100]
我试过将数组转换为列表并排序,但它能够排序正数和负数,但不能排序小数
3条答案
按热度按时间xytpbqjk1#
您遇到的问题是,您不是在比较双精度型,而是在比较字符串。Collections.sort()将调用String.compareTo()方法,这将导致您遇到的行为。以下代码输出您所期望的数组。
rur96b6h2#
问题是你只是把值作为字符串排序。你想做的是把它们当作双精度值排序。你需要提供一个比较器来比较双精度值而不是字符串。
输出
5f0d552i3#
您的代码导入
BigDecimal
,但不使用它。请尝试以下操作:更改此内容:
对此:
还有改变
List<String> k = new ArrayList<>();
到
List<BigDecimal> k = new ArrayList<>();
考虑删除中间阵列,并使用Scanner将新的
BigDecimal
放入k
:备注:
Collections
的sort
方法是 * stable *。这意味着,它不会改变两个相等对象的顺序。BigDecimal.compareTo
将0.00
、0.0000
和0
视为彼此相等。值123
、123.00
和123.000
是另一个示例。因此,在您的示例中,如果排序前0
在000.000
之前,排序后0
将位于000.000
之前。如果排序前000.000
位于0
之前,则排序后000.000
将位于0
之前。如果这对您来说是个问题,您可以创建自定义Comparator
,它可能使用BigDecimal的scale
方法。另一个选项是创建一个自定义类,该类实现Comparable
。