为什么我对Bigdecimal数字的排序方法无法排序?

时间:2017-11-04 18:45:28

标签: java arrays string sorting bigdecimal

问题:我采用了某种排序方法,但它并没有按照我的预期进行,我无法理解我可能在哪里犯错。

我的代码将输入(数字)作为字符串数组转换为字符串数组然后将它们转换为Bigdecimal数字,然后我将它们进行比较,然后在数组中将它们重新排列为字符串

相关代码:

 String s[]={-100, 50, 0, 56.6, 90, 0.12, .12, 02.34, 000.000};

    for(int i=0;i<n-1;i++)
        {
            for (int j =i+1; j<n; j++) 
             {
              BigDecimal  d = new BigDecimal(s[j]); 
              BigDecimal a = new BigDecimal(s[i]);
                if(a.compareTo(d)==-1) 
                    {
                        String m = s[j];
                        s[j]=s[i];
                        s[i]=m;
                    }
              }
        }
         //output :90, 56.6, 50, 02.34, .12, 0.12, 0, 000.000, -100

        //expected output :90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100

约束:s[n]应该是一个字符串数组,如果两个输入具有相同的值,它们应该按照我们输入的顺序在数组中列出。

我不明白为什么0.12和.12的输出顺序与我输入的顺序不同,如果算法出错,那么即使0和000.000也不应该出现与我输入的顺序相同的顺序他们,但他们做了。

2 个答案:

答案 0 :(得分:3)

好吧,既然你想使用字符串数字,你必须将它们包装在引号中,但你的排序可以更具可读性。我建议如下

    String[] numbers ={"-100", "50", "0", "56.6", "90", "0.12", ".12", "02.34", "000.000"};
    List<BigDecimal> decimalList = new ArrayList<>();
    for(String s: numbers){
        decimalList.add(new BigDecimal(s));
    }
    Collections.sort(decimalList);
    Collections.reverse(decimalList);     // edit , forgot this line
    decimalList.forEach(System.out::println);

答案 1 :(得分:3)

您可以使用Stream并将自定义比较器传递给sorted,然后传递collect并打印。像,

String s[] = { "-100", "50", "0", "56.6", "90", "0.12", ".12", "02.34", "000.000" };
System.out.println(Stream.of(s)
        .sorted((a, b) -> new BigDecimal(b).compareTo(new BigDecimal(a)))
        .collect(Collectors.joining(", ")));

我得到(根据要求)

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