这个BigDecimalSorting的问题是什么?代码将数字作为字符串,然后将其转换为BigDecimal,然后排序并打印排序后的BigDecimals。
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
预期产量:9056.6502.340.12.12000.000-100
看起来你扔了一个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)
这是正确的。参见BigDecimalJavadoc
返回:-1、0或1,因为此BigDecimal在数值上小于、等于或大于val。
您可以使用比较器对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]);
}
}
}
排序是数据结构体系中最重要的内容之一,这一块必须要非常熟练的掌握,应该做到可以立马写出每个排序的代码,有多种实现方法的必须多种都能很快写出来,当然对各个排序的性能的了解也是基础且重要的。我们先对排序这一块进行一个整体的把握。
计算机科学领域过度痴迷于排序算法。根据 CS 学生在这个主题上花费的时间,你会认为排序算法的选择是现代软件工程的基石。当然,现实是,软件开发人员可以在很多年中,或者整个职业生涯中,不必考虑排序如何工作。对于几乎所有的应用程序,它们都使用它们使用的语言或库提供的通用算法。通常这样就行了。 所以如果你跳过这一章,不了解排序算法,你仍然是一个优秀的开发人员。但是有一些原因你可能想要这样: 尽管有绝大多数
我想用java类计算,但我总是通过周期数得到异常。我一直在网上寻找,但不幸的是什么也没找到。也许有人能帮我修复它。 例子: 系统出来println(新的BigDecimal(1)。除法(新的BigDecimal(4))--
我在应用程序中使用BigDecimal 作为我的数字,例如,使用 JPA。我对术语“精度”和“规模”进行了一些研究,但我不明白它们到底是什么。 有人能解释一下BigDecimal值的“精度”和“刻度”的含义吗? 谢谢!
我想做一个java程序,用户输入一个十进制数,然后它转换成二进制。这是我到目前为止所拥有的,但是当我输入8时,虽然循环只循环一次,只给我0。我知道二进制中的8是1000,所以我不明白我做错了什么。我需要代码变得简单。请帮忙谢谢
我注意到一件非常奇怪的事情。 读完这节课后,我在C中实现了一些堆排序代码。 代码如下。 奇怪的是,对我来说,构建min堆-提取min(或在构建min堆后在根目录下执行min-heapify)应该按升序进行。然而,在执行此代码并打印出结果向量后,我得到: 在试图弄清楚发生了什么的时候,我改变了 到 最终选择较大(或最大)的父节点和子节点,得到的向量为: 我是否做错了什么,或者我对堆/堆排序的理解不清