【问题标题】:Sorting BigDecimal排序 BigDecimal
【发布时间】:2016-01-01 06:10:58
【问题描述】:

这个 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

【问题讨论】:

  • 你的错误是什么?您的预期输入/输出?
  • 请提及您的问题或预期的 i/o
  • 在这个网站上工作的方法是解释问题是什么,然后人们可以尝试帮助你。如果您不知道是否存在问题或问题是什么,您应该先弄清楚这一点,然后再在本网站上发布问题。
  • 真正的问题是什么?您是否遇到任何错误(如果是,请也粘贴堆栈跟踪)
  • 这认为问题是针对 0.12 和 .12。使用 BigDecimal 初始化这些数字时,将两者都视为 0.12。hackerrank.com/challenges/java-bigdecimal

标签: java arrays sorting java-7 bigdecimal


【解决方案1】:

您可以使用比较器对 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]);
    }
}

【讨论】:

  • 为什么要比较 Object 和 cast?坚持使用字符串?
  • Arrays.sort(s, new Comparator() ...) 和 Arrays.sort(s, 0, n, new Comparator().. .)?在第一种情况下,我得到空点异常。
【解决方案2】:
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]);
        }

    }


}

【讨论】:

  • 与发布者的代码相比,为什么这是一个有效的解决方案的解释将非常合适。对于奖励积分,与其他答案(在您出现前几个月发布)以及为什么您的答案更好或至少不同(并且值得在这些其他答案之后发布)进行比较会很好。
【解决方案3】:

看起来你正在抛出一个 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。

【讨论】:

    【解决方案4】:

    您的代码中有几个错误。

    首先您没有初始化 a 数组,BigDecimal a[] = null 应替换为 BigDecimal a[] = new BigDecimal[n] 以避免 NullPointerException。

    最后你执行排序算法错误,你应该用for (int j = i + 1; j &lt; n; j++)替换内部的for (int j = 1; j &lt; 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]);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 2022-06-22
      • 2019-05-10
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多