对 BigDecimal 进行排序

问题描述 投票:0回答:5

这个 BigDecimalSorting 有什么问题?该代码将数字作为字符串,然后将其转换为 BigDecimal,然后排序并打印排序后的 BigDecimal。

import java.math.BigDecimal;
import java.util.*;

class Solution {
public static void main(String []argh){

    Scanner sc= new Scanner(System.in);
    int n=sc.nextInt();
    String []s=new String[n];
    BigDecimal a[] = null;

    for(int i = 0; i < n ; i++){
        s[i]=sc.next();
        a[i] = new BigDecimal(s[i]);
    }
    for(int i = 0; i < n-1; i++){
        for(int j = 1; j < n; j++){
            if(a[i].compareTo(a[j]) == -1){
                BigDecimal temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
    //Output
    for(int i=0;i<n;i++){
        s[i] = a[i].toString();
        System.out.println(s[i]);
    }
}
}

输入示例: 9 -100 50 0 56.6 90 0.12 .12 02.34 000.000

预期输出: 90 56.6 50 02.34 0.12 .12 0 000.000 -100

java arrays sorting java-7 bigdecimal
5个回答
7
投票

您可以使用比较器对 BigDecimal 进行排序

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();

    Arrays.sort(s, 0, n, new Comparator<Object>() {
        public int compare(Object a1, Object a2) {
            BigDecimal bigDec1 = new BigDecimal((String) a1);
            BigDecimal bigDec2 = new BigDecimal((String) a2);
            return bigDec2.compareTo(bigDec1);
        }
    });


    //Output
    for(int i=0;i<n;i++)
    {
        System.out.println(s[i]);
    }
}

5
投票
import java.math.BigDecimal;
import java.util.*;
class Solution{

    public static void main(String []argh)
    {
        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();
        }

        for(int i=0;i<n;i++)
        {
            BigDecimal max=new BigDecimal(s[i]);
            int idx=i;
            for(int j=i+1;j<n;j++)
            {
                BigDecimal curr=new BigDecimal(s[j]);
                if(curr.compareTo(max)==1)
                {
                    max=curr;
                    idx=j;
                }
            }
            String temp=s[i];
            s[i]=s[idx];
            s[idx]=temp;
        }

        for(int i=0;i<n;i++)
        {
            System.out.println(s[i]);
        }

    }


}

2
投票

看起来您正在抛出 NPE,因为您正在尝试访问空数组。

    BigDecimal a[] = null;  // <---- null array

    for (int i = 0; i < n; i++) {
        s[i] = sc.next();
        a[i] = new BigDecimal(s[i]); // <---- accessing null array a
    }

尝试使用输入中使用的 n 长度初始化数组

    BigDecimal a[] = new BigDecimal[n];

编辑

为了回应马里亚诺的回答,你的

    if (a[i].compareTo(a[j]) == -1)

是正确的。请参阅 BigDecimal javadoc

退货: -1、0 或 1,因为此 BigDecimal 在数值上小于、等于或大于 val。


1
投票

您的代码中有一些错误。

首先,您没有初始化 a 数组,应将

BigDecimal a[] = null
替换为
BigDecimal a[] = new BigDecimal[n]
以避免 NullPointerException。

最后你错误地实现了排序算法,你应该用

for (int j = 1; j < n; j++)
 替换内部 
for (int j = i + 1; j < n; j++)

您的代码应如下所示:

import java.math.BigDecimal;
import java.util.Scanner;

public class Solution {
    public static void main(final String[] argh) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] s = new String[n];
        BigDecimal a[] = new BigDecimal[n];

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

        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                if (a[i].compareTo(a[j]) == -1) {
                    BigDecimal temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                }
            }
        }
        // Output
        for (int i = 0; i < n; i++) {
            s[i] = a[i].toString();
            System.out.println(s[i]);
        }
    }
}

0
投票

使用

Collections.sort()
提供了 Sahil 答案的更简单版本:

List<BigDecimal> values = Arrays.asList(new BigDecimal[] {
  new BigDecimal("1.2"),
  new BigDecimal("1.1"),
  new BigDecimal("9.2"),
  new BigDecimal("4.2"),
});

// Sort from low to high
Collections.sort(values);    

for (var value : values) {
  System.out.println(value);
}
© www.soinside.com 2019 - 2024. All rights reserved.