【问题标题】:Comparing Numbers in string with Enum将字符串中的数字与枚举进行比较
【发布时间】:2017-04-11 06:04:17
【问题描述】:

我正在使用枚举来定义我的所有常量变量。

枚举

public enum ApplicationStatus {
        Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), SoftDenial(
                5), Deferred(6), Saved(7), Cancelled(8), Approved_NoSSN(9), PendingVerification_NoSSN(
                10), Approved_Archived(11);

        private final int value;

        private ApplicationStatus(int value) {
            this.value = value;
        }

        public int getStatusMasterId() {
            return value;
        }
    };

我需要比较两个整数值。比较以下整数的有效方法是什么?

比较整数:-

public void applicationStatus(){
    String applicationStatus = null;
    String statusMasterId = "2";
    if(ApplicationStatus.PendingVerification.ordinal() == Integer.parseInt(statusMasterId)){
        applicationStatus = "Pending Verification";
    }
}

欢迎提出建议!

【问题讨论】:

  • 可能是switch case
  • 您不想使用getStatusMasterId 代替ordinal 吗?我还考虑在ApplicationStatus 中有一个方法,它可以采用int 值并返回ApplicationStatus,但这只是我
  • 你想完成什么?
  • 您可能还想在枚举中添加 ApplicationStatus 消息为 String,以免一直重写它们(如果它们从未不同)
  • 一个完整的旁白,Approved_Archeived,应该是“存档”还是“实现”?

标签: java enums comparison


【解决方案1】:

我有几个建议。如果它们不适合您,请随意丢弃。

既然你说你需要枚举的序数,你可能会走另一条路:

    if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.PendingVerification) {
        // do your stuff
    }

请注意,问题Integer.parseInt(statusMasterId) 可能会抛出NumberFormatException

另一个建议,Jay Smith 的回答中的比较方法可以更进一步接受字符串参数:

public enum ApplicationStatus {
    Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
    SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
    Approved_NoSSN(9),PendingVerification_NoSSN(10), 
    Approved_Archeived(11);

    private final int value;
    // redundant representation of ordinal() as a string for comparison to other strings
    private final String ordinalAsString;

    private ApplicationStatus(int value) {
        this.value = value;
        ordinalAsString = String.valueOf(ordinal());
    }

    public int getStatusMasterId() {
        return value;
    }

    public boolean compare(String stringValue) {
        return this.ordinalAsString.equals(stringValue);
    }
}

NumberFormatException 没有风险,但您可能会认为那里的风险更严重:这将无法识别例如 "+2""02" 代表数字 2。是否要存储字符串枚举对象中永久存在的值是有问题的;如果您真的希望比较有效,那么您确实想要。 Jay Smith 的代码使用的是value,我已将其更改为使用ordinal()

这是测试!

    String statusMasterId = "2";
    if (ApplicationStatus.values()[Integer.parseInt(statusMasterId)] == ApplicationStatus.NotEligible) {
        System.out.println("Not eligible");
    }
    if (ApplicationStatus.NotEligible.compare(statusMasterId)) {
        System.out.println("Still not eligible using the compare() method");
    }

打印出来

Not eligible
Still not eligible using the compare() method

这是因为序数从0开始,所以NotEligible,值为3,序数为2,不是一回事。

【讨论】:

  • 我这样打电话,但它返回 false - if(ApplicationStatus.Initiated.compare(statusMasterId)){ applicationStatus = "Initiated"; System.out.println(applicationStatus); }
  • 你测试了 compare() 代码吗...它返回 false
  • V.V - 这很好用......但我试图在我的 if 条件下使用 compare()。那是返回错误..这是我关心的问题
  • 谢谢。它工作正常。我在这一行做了一点修改。 ordinalAsString = String.valueOf(ordinal() + 1);
  • 非常好。在这种情况下,我认为您将希望将其命名为 valueAsString 并将 String.valueOf(value) 分配给它。
【解决方案2】:

你有两个选择两个比较枚举。

  1. 使用Java枚举的内置compareTo方法。见https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#compareTo(E)
  2. 在枚举中创建自己的比较方法。喜欢:

    public enum ApplicationStatus {
        Initiated(1), PendingVerification(2), NotEligible(3), Approved(4), 
        SoftDenial(5), Deferred(6), Saved(7), Cancelled(8), 
        Approved_NoSSN(9),PendingVerification_NoSSN(10), 
        Approved_Archeived(11);
    
        private final int value;
    
        private ApplicationStatus(int value) {
            this.value = value;
        }
    
        public int getStatusMasterId() {
            return value;
        }
        public boolean compare(int value) {
            return this.value==value;
        }
    };
    

【讨论】:

  • 非常好的信息。我认为您一直在跳过关于字符串中的一个数字的部分。也许提问者可以自己调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-02-16
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多