大十进制数组不排序 0 和 000.000
Big Decimal array not sorting 0 and 000.000
我正在解决一个 java HackerRank 问题,在这个问题中我必须使用 BigDecimal
class 对包含十进制数的数组进行降序排序命令。除了出现 0 和 000.000 的情况外,该解决方案工作正常。现在它们相等,问题告诉我们不要让它们按相同的出现顺序排列,但它并没有发生。
我的代码:
import java.io.*;
import java.math.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String [] array = new String[n];
for(int i=0; i<array.length; i++){
array[i] = input.next();
}
String temp;
for(int i= array.length-1; i>=0; i--){
for(int j=i-1; j>=0; j--){
if(new BigDecimal(array[i]).compareTo(new BigDecimal(array[j]))>0){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for(int i=0; i<array.length; i++){
System.out.println(array[i]);
}
}
}
示例输入:
9
---> 数组的大小
- -100
- 50
- 0
- 56.6
- 90
- 0.12
- .12
- 02.34
- 000.000
你的问题是排序的稳定性。你应该 select 一个稳定的排序算法。
Insertion sort就是这样一个
String temp;
for (int i = 0; i < n; i++) {
for (int j = i; j > 0
&& new BigDecimal(array[j - 1]).compareTo(new BigDecimal(array[j])) < 0; j--) {
temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
System.out.println(Arrays.toString(array));
输出:
[90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]
我在你的代码中做了很多改动。看看吧。
Scanner input = new Scanner(System.in);
int n = input.nextInt(); // getting the size
List<BigDecimal> numbers = new ArrayList<>(); // Creating a list that holds our BigDecimals
for (int i = 0; i < n; i++)
{
double tmp = input.nextDouble(); // Getting the value as a Double and not as a string. It makes no sense to parse the string into a number later again
numbers.add(BigDecimal.valueOf(tmp)); // Adding the double value as a BigDecimal
}
numbers.sort(BigDecimal::compareTo); // Sorting the list through the help of .compareTo() function
for (BigDecimal s : numbers)
{
System.out.println(s);
}
用户输入时尽量避免使用字符串,应该强制输入数字,不要出现乱码再尝试解析,后面会出问题,错误输入最好在它进来的那一刻。
我正在解决一个 java HackerRank 问题,在这个问题中我必须使用 BigDecimal
class 对包含十进制数的数组进行降序排序命令。除了出现 0 和 000.000 的情况外,该解决方案工作正常。现在它们相等,问题告诉我们不要让它们按相同的出现顺序排列,但它并没有发生。
我的代码:
import java.io.*;
import java.math.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String [] array = new String[n];
for(int i=0; i<array.length; i++){
array[i] = input.next();
}
String temp;
for(int i= array.length-1; i>=0; i--){
for(int j=i-1; j>=0; j--){
if(new BigDecimal(array[i]).compareTo(new BigDecimal(array[j]))>0){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for(int i=0; i<array.length; i++){
System.out.println(array[i]);
}
}
}
示例输入:
9
---> 数组的大小
- -100
- 50
- 0
- 56.6
- 90
- 0.12
- .12
- 02.34
- 000.000
你的问题是排序的稳定性。你应该 select 一个稳定的排序算法。 Insertion sort就是这样一个
String temp;
for (int i = 0; i < n; i++) {
for (int j = i; j > 0
&& new BigDecimal(array[j - 1]).compareTo(new BigDecimal(array[j])) < 0; j--) {
temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
System.out.println(Arrays.toString(array));
输出:
[90, 56.6, 50, 02.34, 0.12, .12, 0, 000.000, -100]
我在你的代码中做了很多改动。看看吧。
Scanner input = new Scanner(System.in);
int n = input.nextInt(); // getting the size
List<BigDecimal> numbers = new ArrayList<>(); // Creating a list that holds our BigDecimals
for (int i = 0; i < n; i++)
{
double tmp = input.nextDouble(); // Getting the value as a Double and not as a string. It makes no sense to parse the string into a number later again
numbers.add(BigDecimal.valueOf(tmp)); // Adding the double value as a BigDecimal
}
numbers.sort(BigDecimal::compareTo); // Sorting the list through the help of .compareTo() function
for (BigDecimal s : numbers)
{
System.out.println(s);
}
用户输入时尽量避免使用字符串,应该强制输入数字,不要出现乱码再尝试解析,后面会出问题,错误输入最好在它进来的那一刻。