【问题标题】:Why does my sorting method for Bigdecimal numbers fails to sort?为什么我的 Bigdecimal 数字排序方法无法排序?
【发布时间】:2018-04-17 06:41:52
【问题描述】:

问题:我采用了某种排序方法,但没有达到我的预期,我不明白我可能在哪里出错。

我的代码将输入(即数字)作为字符串转换为字符串数组,然后在我比较它们时将它们转换为 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 也不应该以我输入它们的顺序出现,但他们确实做到了。

【问题讨论】:

  • 为什么你的字符串数组不包含字符串?
  • 其实是问题限制,数字必须作为字符串输入
  • 不要重新发明排序。只需将您的字符串包装到一个包含字符串及其十进制等效项的对象中,然后对这些对象进行排序,然后提取字符串。
  • @ArnavDas 使代码更简单以使问题更易于理解不是问题。但这并不意味着它不应该编译。您将整数和数字存储在 String 数组中,因此无法编译。
  • @ArnavDas 我想找出答案的唯一方法就是自己调试。在它拥有的这么多步骤中的某个时刻,它会切换“0.12”、“.12”位置。也许尝试一个较小的阵列。也许只是 "0","90","0.12", ".12" 。我猜到那时你会找到答案的。

标签: java arrays string sorting bigdecimal


【解决方案1】:

您可以使用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

【讨论】:

  • 你认为这比 Stefan 的回答更易读吗?
  • @ThomasS。我认为它更具可读性,可以打印 OP 要求的内容并正确排序(如果我们比较结果,Stefan 会生成 -100, 0, 0.000, 0.12, 0.12, 2.34, 50, 56.6, 90 - 这是不正确的)。
  • 赞成您的答案,因为它充分利用了 Java 8 函数的潜力和更少的代码。我认为我的对于入门级编码人员来说可读性更好,经过编辑以产生正确的结果。
  • 对于一个现实世界的问题,我认为这个解决方案更难阅读,更难调试并且由于创建了更多的临时对象而具有更大的开销(例如,每次比较都会创建 2 个 BigDecimal,而不是每个列表中的条目作为 Stefan 的答案)。
【解决方案2】:

好吧,既然你想使用字符串数字,你将不得不用引号将它们包裹起来,但你的排序可以更具可读性。我会建议以下

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

【讨论】:

  • 这对于新手来说绝对是更好的答案,因为每一步都变得更加清晰——不管使用了更多的字符。最后,它认为代码是可读的,因此更容易理解。
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多