对从字符串解析的BigDecimals列表进行排序,同时维护值相等的数字顺序

时间:2016-09-09 13:19:34

标签: java sorting bigdecimal

我读了一个表示各种格式数字的字符串列表

我将这些数字解析为BigDecimals并对它们进行排序。

然后我以原始格式打印出数字。

问题是我需要保持相同数字的顺序,这在当前代码中没有发生。

import java.math.BigDecimal;
import java.util.*;
class Solution{

    public static void main(String []args){
        //Input
        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(); for (int i = 0; i < n -1; i++) {
            for (int k = (i + 1); k < n; k++) {
                if (new BigDecimal(s[i]).compareTo(new BigDecimal(s[k])) < 0) {
                    String tempValue = s[i];
                    s[i] = s[k];
                    s[k] = tempValue;
                }
            }
        }

输入

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

输出

90  
56.6  
50  
02.34  
.12  
0.12  (Wrong order here)  
0  
000.000  
-100  

预期产出

90  
56.6  
50  
02.34  
0.12  
.12  
0  
000.000  
-100  

解决方案

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

3 个答案:

答案 0 :(得分:2)

问题是您使用的选择排序算法不稳定。也就是说,它不能确保具有相同值的项目在列表中保持其相对顺序。考虑这个简单的项目列表:[5.0, 5, 3, 6]

如果您想按降序排序,那么在第一次选择排序后,您将拥有:[6, 5, 3, 5.0]5.0已与6交换。商品5.05现在已经无序,他们会保持这种状态。

插入排序和冒泡排序是稳定的算法,它保持相等项的相对顺序。我建议使用这两种算法中的一种代替你的选择排序。

答案 1 :(得分:0)

我建议采用不同的方法,使用更好的抽象。您可以使用Map<BigDecimal, String>。映射:用户输入的字符串。映射:通过解析该字符串获得的BigDecimal对象。

现在您只需要对地图键进行排序;当你按照排序的顺序打印它们时,你将每个BigDecimal用作键...这样地图就会给你初始的“字符串”值。

类似的东西:

Map<BigDecimal, String> stringsByValue = new HashMap<>();
stringsByValue.put(...

for (BigDecimal value : Collections.sort(stringsByValue.keySet())) {
  String originalInput = stringsByValue.get(value); ...

可能需要进行一些调整才能使原始顺序保持相同的值。

答案 2 :(得分:0)

使用com.google.gson.internal.LinkedTreeMap

  

与值相当的键的映射。与TreeMap不同,此类使用迭代顺序的插入顺序。比较顺序仅用作有效插入和删除的优化。

java中有LinkedHashMap

  

Map接口的哈希表和链表实现,具有可预测的迭代顺序......

但它没有订购。