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

Sort a list of BigDecimals parsed from Strings, while maintainig the order of numbers where the values are equal

我看到了一个字符串列表,这些字符串以各种格式表示数字

我正在将这些数字解析为 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;
         }
      }

我会建议一种不同的方法,使用更好的抽象。您可以使用 Map<BigDecimal, String>。 Mapvalue:用户输入的字符串。 Map key:解析该字符串得到的BigDecimal对象。

现在您只需要对地图键进行排序;并且当您按排序顺序打印它们时,您使用每个 BigDecimal 作为键......以便地图为您提供初始 "string" 值。

类似于:

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

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

也许这需要一些调整以保持相等值的原始顺序。

使用com.google.gson.internal.LinkedTreeMap

A map of comparable keys to values. Unlike TreeMap, this class uses insertion order for iteration order. Comparison order is only used as an optimization for efficient insertion and removal.

java中有一个LinkedHashMap

Hash table and linked list implementation of the Map interface, with predictable iteration order ...

但是没有订购。

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

如果你想按降序排序,那么在第一次选择排序之后,你将得到:[6, 5, 3, 5.0]5.06 交换。 5.05 项现在出现故障,它们将保持这种状态。

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