这个 BigDecimalSorting 有什么问题?该代码将数字作为字符串,然后将其转换为 BigDecimal,然后排序并打印排序后的 BigDecimal。
import java.math.BigDecimal;
import java.util.*;
class Solution {
public static void main(String []argh){
Scanner sc= new Scanner(System.in);
int n=sc.nextInt();
String []s=new String[n];
BigDecimal a[] = null;
for(int i = 0; i < n ; i++){
s[i]=sc.next();
a[i] = new BigDecimal(s[i]);
}
for(int i = 0; i < n-1; i++){
for(int j = 1; j < n; j++){
if(a[i].compareTo(a[j]) == -1){
BigDecimal temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
//Output
for(int i=0;i<n;i++){
s[i] = a[i].toString();
System.out.println(s[i]);
}
}
}
输入示例: 9 -100 50 0 56.6 90 0.12 .12 02.34 000.000
预期输出: 90 56.6 50 02.34 0.12 .12 0 000.000 -100
您可以使用比较器对 BigDecimal 进行排序
import java.math.BigDecimal;
import java.util.*;
class Solution{
public static void main(String []args){
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();
Arrays.sort(s, 0, n, new Comparator<Object>() {
public int compare(Object a1, Object a2) {
BigDecimal bigDec1 = new BigDecimal((String) a1);
BigDecimal bigDec2 = new BigDecimal((String) a2);
return bigDec2.compareTo(bigDec1);
}
});
//Output
for(int i=0;i<n;i++)
{
System.out.println(s[i]);
}
}
import java.math.BigDecimal;
import java.util.*;
class Solution{
public static void main(String []argh)
{
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();
}
for(int i=0;i<n;i++)
{
BigDecimal max=new BigDecimal(s[i]);
int idx=i;
for(int j=i+1;j<n;j++)
{
BigDecimal curr=new BigDecimal(s[j]);
if(curr.compareTo(max)==1)
{
max=curr;
idx=j;
}
}
String temp=s[i];
s[i]=s[idx];
s[idx]=temp;
}
for(int i=0;i<n;i++)
{
System.out.println(s[i]);
}
}
}
看起来您正在抛出 NPE,因为您正在尝试访问空数组。
BigDecimal a[] = null; // <---- null array
for (int i = 0; i < n; i++) {
s[i] = sc.next();
a[i] = new BigDecimal(s[i]); // <---- accessing null array a
}
尝试使用输入中使用的 n 长度初始化数组
BigDecimal a[] = new BigDecimal[n];
编辑
为了回应马里亚诺的回答,你的
if (a[i].compareTo(a[j]) == -1)
是正确的。请参阅 BigDecimal javadoc
退货: -1、0 或 1,因为此 BigDecimal 在数值上小于、等于或大于 val。
您的代码中有一些错误。
首先,您没有初始化 a 数组,应将
BigDecimal a[] = null
替换为 BigDecimal a[] = new BigDecimal[n]
以避免 NullPointerException。
最后你错误地实现了排序算法,你应该用
for (int j = 1; j < n; j++)
替换内部
for (int j = i + 1; j < n; j++)
您的代码应如下所示:
import java.math.BigDecimal;
import java.util.Scanner;
public class Solution {
public static void main(final String[] argh) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n];
BigDecimal a[] = new BigDecimal[n];
for (int i = 0; i < n; i++) {
s[i] = sc.next();
a[i] = new BigDecimal(s[i]);
}
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i].compareTo(a[j]) == -1) {
BigDecimal temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
// Output
for (int i = 0; i < n; i++) {
s[i] = a[i].toString();
System.out.println(s[i]);
}
}
}
使用
Collections.sort()
提供了 Sahil 答案的更简单版本:
List<BigDecimal> values = Arrays.asList(new BigDecimal[] {
new BigDecimal("1.2"),
new BigDecimal("1.1"),
new BigDecimal("9.2"),
new BigDecimal("4.2"),
});
// Sort from low to high
Collections.sort(values);
for (var value : values) {
System.out.println(value);
}