java 小数降序

oymdgrw7  于 2023-01-24  发布在  Java
关注(0)|答案(3)|浏览(134)

请将下面的列表从小到大排序。
数组输入:[-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]
我试过将数组转换为列表并排序,但它能够排序正数和负数,但不能排序小数

xytpbqjk

xytpbqjk1#

您遇到的问题是,您不是在比较双精度型,而是在比较字符串。Collections.sort()将调用String.compareTo()方法,这将导致您遇到的行为。以下代码输出您所期望的数组。

String[] yourArray = {"-100","50","0","56.6","90","0.12",".12","02.34","000.000"};
    List<Double> k = new ArrayList<>();
    for (int i = 0; i < yourArray.length; i++) {
        k.add(Double.parseDouble(yourArray[i]));
    }
    Collections.sort(k, Collections.reverseOrder());
    for (int i = 0; i < k.size(); i++) {
        System.out.print(k.get(i) + " ");
    }
rur96b6h

rur96b6h2#

问题是你只是把值作为字符串排序。你想做的是把它们当作双精度值排序。你需要提供一个比较器来比较双精度值而不是字符串。

import java.util.*;
public class Main{
 public static void main(String[] args) {
  String []s = {"-100","50","0","56.6","90","0.12",".12","02.34","000.000"};
  System.out.println("Before  : " + Arrays.toString(s));
  Arrays.sort(s, (x,y)->Double.valueOf(y).compareTo(Double.valueOf(x)));
  System.out.println("Actual  : " + Arrays.toString(s));
  System.out.println("Expected: [90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]");
 }
}

输出

Before  : [-100, 50, 0, 56.6, 90, 0.12, .12, 02.34, 000.000]
Actual  : [90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]
Expected: [90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]
5f0d552i

5f0d552i3#

您的代码导入BigDecimal,但不使用它。请尝试以下操作:
更改此内容:

String []s=new String[n+2];
for(int i=0;i<n;i++){
  s[i]=sc.next();
}

对此:

BigDecimal [] s = new BigDecimal[n];
for(int i=0;i<n;i++){
  s[i]=sc.nextBigDecimal();
}

还有改变
List<String> k = new ArrayList<>();

List<BigDecimal> k = new ArrayList<>();
考虑删除中间阵列,并使用Scanner将新的BigDecimal放入k

List<BigDecimal> k = new ArrayList<> ();
 for (int i < 0; i < n; i++) {
    k.add (sc.nextBigDecimal());
 }

备注:

Collectionssort方法是 * stable *。这意味着,它不会改变两个相等对象的顺序。
BigDecimal.compareTo0.000.00000视为彼此相等。值123123.00123.000是另一个示例。因此,在您的示例中,如果排序前0000.000之前,排序后0将位于000.000之前。如果排序前000.000位于0之前,则排序后000.000将位于0之前。如果这对您来说是个问题,您可以创建自定义Comparator,它可能使用BigDecimal的scale方法。另一个选项是创建一个自定义类,该类实现Comparable

相关问题