当前位置: 首页 > 知识库问答 >
问题:

java:比使用if和else更好的方法

查学文
2023-03-14

我有一个要求,取决于地图的特定键值,我需要格式化输出。

例如,如果它的值大于1,那么只需要在值(12.23)后面显示2个小数点,或者如果它的值小于1,我需要在它后面显示4个小数点。

我已经编写了代码,它工作正常,但我正在寻找一种更好的方法来做到这一点(基本上我不喜欢我的代码中的其他条件)

这是我的程序,根据最后一个属性键值,我正在格式化输出

package com;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class CustValues {

    public static void main(String args[]) {

        Map valuesMap = new HashMap();

        valuesMap.put("mktCap", "12.4d");
        valuesMap.put("last", "0.4344");
        valuesMap.put("avgvalue", "34.55");
        valuesMap.put("bidprice", "44.44");

        Iterator<String> iterator = valuesMap.keySet().iterator();

        while (iterator.hasNext()) {
            String name = iterator.next().toString();

            String value = (String) valuesMap.get(name);

            if (name.equals("last")) {

                String result = "";

                double d = Double.parseDouble(value);

                if (d > 1) {
                    result = formatNumber(value, 2);
                } else {
                    result = formatNumber(value, 4);
                }

                System.out.println(result);
            }

        }

    }

    public static String formatNumber(String s, int decPts) {
        double d = Double.parseDouble(s);

        if (2 == decPts)
            return new DecimalFormat("#,###,###,##0.00").format(d);
        else if (0 == decPts)
            return new DecimalFormat("#,###,###,##0").format(d);
        else if (3 == decPts)
            return new DecimalFormat("#,###,###,##0.000").format(d);
        else if (4 == decPts)
            return new DecimalFormat("0.0000").format(d);
        return String.valueOf(d);

    }

}

共有3个答案

锺离马鲁
2023-03-14

基于Code-Guru的答案。您可以使用映射,但为了保留相同的线程安全和默认行为,代码变成了:

public class CustValues {
    private static final Map<Integer, String> FORMATS;
    static {
        Map<Integer, String> formats = new HashMap<Integer, String>();

        formats.put( 0, "#,###,###,##0" );
        formats.put( 2, "#,###,###,##0.00" );
        formats.put( 3, "#,###,###,##0.000" );
        formats.put( 4, "0.0000" );

        FORMATS = Collections.unmodifiableMap( formats );
    }

    public static void main(String args[]) {
        // Same as before....
    }

    public static String formatNumber(String s, int decPts) {
        double d = Double.parseDouble(s);
        String format = FORMATS.get(decPts);
        if( format != null ) {
            return new DecimalFormat(format).format(d);
        }
        return String.valueOf(d);
    }
}

您需要为每个请求创建一个新的 DecimalFormat,而不是重用它,因为它不是线程安全的。这还可以处理 decPts 不是 0、2、3 或 4 的情况。

孟选
2023-03-14

formatNumber 方法中实现的逻辑是 switch 语句的完美候选项。尝试

switch (decPts) {
    case 0:
        return new DecimalFormat("#,###,###,##0").format(d);
        break;
    case 2:
        return new DecimalFormat("#,###,###,##0.00").format(d);
        break;
    ...
}

有关详细信息,请参阅本教程

编辑:虽然SJuan76捷足先登,但我更喜欢代码大师的想法!

田仲卿
2023-03-14

您可以创建<code>地图

 类似资料:
  • 问题内容: 谈论Java性能..哪个更好?if..else或多个if 要么 对您的想法感兴趣 谢谢! 问题答案: 在性能方面没有区别。选择最易读的选项,具体取决于代码的功能。 通常,不必担心这些微优化。只有在确定存在需要解决的性能问题后,才能进行优化。 “我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源。” -唐纳德​​·努斯

  • 这个示例代码来自一本Java书籍,从墙上的99瓶啤酒到没有啤酒打印出这首歌。问题是,当墙上是1瓶啤酒时,它仍然写着瓶子。我试图通过在末尾添加部分来解决这个问题。但是,它仍然显示1瓶啤酒在墙上,我瓶啤酒在墙上。 我不知道该改变什么来解决这个问题。是否创建另一个while部分? 如果你能给他们一个提示,这样我就可以自己解决它,那也很酷!因为我知道我的实际歌曲输出是在第一个if部分,但我不知道我应该在哪

  • > 我看到接口只允许实现方法。那么为什么我们甚至需要这个接口呢?为什么我们不能简单地在我们想要的任何类中定义和声明该方法,而无需实现接口? 我知道这是正确的:

  • 我正在写一个Python程序,在这里我需要一个if-ther案例来选择1和9之间的一个数字,每个数字都被分配给一个类。关于如何缩短这段代码的任何建议?

  • Perl条件语句有助于决策,这需要程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的其他条件如果确定条件为假,则执行语句。 以下是大多数编程语言中的典型决策结构的一般性 - 数字0,字符串'0'和“”,空列表()和undef在布尔上下文中都是false ,所有其他值都为true 。 否定真正的价值! 或not返回特殊的假值。 Perl编程语言提供

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执