【问题标题】:Here the .12 is converting to 0.12 but I want to avoid that这里 .12 正在转换为 0.12 但我想避免这种情况
【发布时间】:2022-01-11 16:39:04
【问题描述】:

以下代码会将字符串数组值转换为小数并按降序排列,我必须再次将其打印为字符串,而不是小数。这里的问题是,在将字符串转换为小数时,“.1”值变为“0.1”,但我需要它仅将其打印为“.1”。

代码:

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();
        BigDecimal[] d=new BigDecimal[n];
         for(int i=0;i<n;i++){
          d[i]=new BigDecimal(s[i]);
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(d[j].compareTo(d[i]) == 0)
                    continue;
                else if(d[j].compareTo(d[i]) > 0)
                {
                    BigDecimal t=d[i];
                    d[i]=d[j];
                    d[j]=t;
                    
                }
            }
        }
        
        for(int i=0;i<n;i++)
        {
            s[i]=d[i].toString();
        }
        
        //Output
        for(int i=0;i<n;i++)
        {
            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

我的输出:

90
56.6
50
2.34
0.12
0.12
0
0.000
-100

【问题讨论】:

标签: java arrays string bigdecimal


【解决方案1】:

您必须创建一个类来保存Stringdouble 值。当您比较项目进行排序时,您应该使用double 值。打印项目时,应使用String 值。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    scan.useLocale(Locale.ENGLISH);
    StringDoubleNumber[] numbers = readStringNumbers(scan);
    Arrays.sort(numbers);
    printDesc(numbers);
}

private static StringDoubleNumber[] readStringNumbers(Scanner scan) {
    System.out.print("Total numbers: ");
    int total = scan.nextInt();

    StringDoubleNumber[] numbers = new StringDoubleNumber[total];

    for (int i = 0; i < total; i++) {
        System.out.format("%d: ", i + 1);
        numbers[i] = new StringDoubleNumber(scan.next());
    }

    return numbers;
}

private static void printDesc(StringDoubleNumber[] numbers) {
    System.out.println("Numbers in descending order:");
    
    for (int i = numbers.length - 1; i >= 0; i--)
        System.out.println(numbers[i]);
}

private static final class StringDoubleNumber implements Comparable<StringDoubleNumber> {

    private final String str;
    private final double val;

    public StringDoubleNumber(String str) {
        this.str = str;
        val = Double.parseDouble(str);
    }

    @Override
    public int compareTo(StringDoubleNumber obj) {
        return Double.compare(val, obj.val);
    }

    @Override
    public String toString() {
        return str;
    }

}

【讨论】:

  • 很好,你可以在这里使用record类。
【解决方案2】:

我会同时存储字符串和数字。打印时,我会打印字符串。比较时,它将使用数字。为此,我只需扩展 BigDecimal 数字并使用一个实例变量来存储字符串。我还重写了 toString 方法以返回字符串。

class MyBigDecimal extends java.math.BigDecimal {
    private String str;
    public MyBigDecimal(String str){
        super(str);
        this.str = str.trim();
    }
    public String toString(){ return str; }
}

public class Main{
    public static void main(String[] args) {
        String input = "9 -100 50 0 56.6 90 0.12 .12 02.34 000.000";
        String [] items = input.split(" ");
        
        MyBigDecimal[] d = new MyBigDecimal[items.length];
        
        for(int i=0; i<items.length; i++)
            d[i] = new MyBigDecimal(items[i]);
        
        for(MyBigDecimal x: d)
            System.out.println(x);
        
    }
}

输出:

9
-100
50
0
56.6
90
0.12
.12
02.34
000.000

【讨论】:

  • 你好,我是 java 新手,我知道 super 关键字,但在这里我有点困惑,super(str) 有什么用。你能解释一下 MyBigDecimal 类的代码吗..
【解决方案3】:

好吧,既然您没有指定任何特定的要求或约束,您不妨这样做。你真的不需要BigDecimal。这只是对双精度值进行排序并打印字符串。

  • 通过扫描仪获取值并将它们放入一个数组中(显示了数组)。
  • 使用 Comparator 对已解析的 Double 进行流式处理并按相反顺序排序。
  • 并将排序后的数组分配回原始数组(或者,如果您选择其他数组)。
  • 并打印值
String[] v = { "56.6", "0.12", "-100", "02.34", "50",
        "000.000", "0", ".12", "90" };

v = Arrays.stream(v)
        .sorted(Comparator.comparingDouble(Double::parseDouble).reversed())
        .toArray(String[]::new);
    
for (String str: v) {
    System.out.println(str);
}

打印

90
56.6
50
02.34
0.12
.12
000.000
0
-100

如果您想使用大部分原始代码,则只需维护一个单独的原始字符串值数组。在排序算法中对双精度进行排序时,还要使用相同的索引交换 original 字符串值。打印时,打印字符串版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多