我读了一个表示各种格式数字的字符串列表
我将这些数字解析为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;
}
}
答案 0 :(得分:2)
问题是您使用的选择排序算法不稳定。也就是说,它不能确保具有相同值的项目在列表中保持其相对顺序。考虑这个简单的项目列表:[5.0, 5, 3, 6]
。
如果您想按降序排序,那么在第一次选择排序后,您将拥有:[6, 5, 3, 5.0]
。 5.0
已与6
交换。商品5.0
和5
现在已经无序,他们会保持这种状态。
插入排序和冒泡排序是稳定的算法,它保持相等项的相对顺序。我建议使用这两种算法中的一种代替你的选择排序。
答案 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接口的哈希表和链表实现,具有可预测的迭代顺序......
但它没有订购。