大十进制数组不排序 0 和 000.000

Big Decimal array not sorting 0 and 000.000

我正在解决一个 java HackerRank 问题,在这个问题中我必须使用 BigDecimal class 对包含十进制数的数组进行降序排序命令。除了出现 0 和 000.000 的情况外,该解决方案工作正常。现在它们相等,问题告诉我们不要让它们按相同的出现顺序排列,但它并没有发生。

我的代码:

    import java.io.*;
    import java.math.*;
    import java.util.*;
    
    public class Solution {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            String [] array = new String[n];
            for(int i=0; i<array.length; i++){
                array[i] = input.next();
            }
            String temp;
            for(int i= array.length-1; i>=0; i--){
                for(int j=i-1; j>=0; j--){
                    if(new BigDecimal(array[i]).compareTo(new BigDecimal(array[j]))>0){
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
            }
            for(int i=0; i<array.length; i++){
                System.out.println(array[i]);
            }          
        }
    }

示例输入: 9 ---> 数组的大小

  1. -100
  2. 50
  3. 0
  4. 56.6
  5. 90
  6. 0.12
  7. .12
  8. 02.34
  9. 000.000

你的问题是排序的稳定性。你应该 select 一个稳定的排序算法。 Insertion sort就是这样一个

String temp;
for (int i = 0; i < n; i++) {
    for (int j = i; j > 0
        && new BigDecimal(array[j - 1]).compareTo(new BigDecimal(array[j])) < 0; j--) {
        temp = array[j - 1];
        array[j - 1] = array[j];
        array[j] = temp;
    }
}
System.out.println(Arrays.toString(array));

输出:

[90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]

我在你的代码中做了很多改动。看看吧。

Scanner input = new Scanner(System.in);
int n = input.nextInt(); // getting the size

List<BigDecimal> numbers = new ArrayList<>(); // Creating a list that holds our BigDecimals
for (int i = 0; i < n; i++)
{
    double tmp = input.nextDouble(); // Getting the value as a Double and not as a string. It makes no sense to parse the string into a number later again
    numbers.add(BigDecimal.valueOf(tmp)); // Adding the double value as a BigDecimal
}

numbers.sort(BigDecimal::compareTo); // Sorting the list through the help of .compareTo() function

for (BigDecimal s : numbers)
{
    System.out.println(s);
}

用户输入时尽量避免使用字符串,应该强制输入数字,不要出现乱码再尝试解析,后面会出问题,错误输入最好在它进来的那一刻。