对从字符串解析的 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.0
与 6
交换。 5.0
和 5
项现在出现故障,它们将保持这种状态。
插入排序和冒泡排序是稳定的算法,它们保持相等项的相对顺序。我建议使用这两种算法中的一种来代替您的选择排序。
我看到了一个字符串列表,这些字符串以各种格式表示数字
我正在将这些数字解析为 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.0
与 6
交换。 5.0
和 5
项现在出现故障,它们将保持这种状态。
插入排序和冒泡排序是稳定的算法,它们保持相等项的相对顺序。我建议使用这两种算法中的一种来代替您的选择排序。