Java:获取字符串值,而不考虑 switch-case 中的区分大小写

Java: get string value regardless of case sensitivity in switch-case

提问人:mi_mo 提问时间:4/5/2021 更新时间:4/5/2021 访问量:219

问:

我有一些字符串(字符串结果),用户将其插入应用程序中,没有任何区分大小写的策略,用户可以插入,例如:“失败”或“失败”或“失败”和“成功”或“成功”等。而且我每个方法只有一个,例如:fail()、success()并且必须调用相关方法

现在我想通过使用以下常量(success,fail,...)将一个字符串放入 switch-case 语句:

  public final class ActionResultStatus
{
    public static final String SUCCESS = "Success";
    public static final String FAIL = "Fail";
    public static final String REJECTED = "Rejected";
    public static final String IN_PROGRESS = "InProgress";
}

String result = userClass.getResult(); //UserClass  is a container class for user inputted data
switch(result)
{
case ActionResultStatus.FAIL:
  fail();

case ActionResultStatus.SUCCESS :
  success();
}

请注意:

1-我不想使用或用于结果,因为我必须添加更多的案例陈述。toUpperCase()toLowerCase()

2-我无法将我的 Constatn 类字段值更改为小写,它们必须是 pascal-case,如:“Success”,因为它们必须以 pascal-case 模式完全保留在 DB 上

3-我认为我不能在这种情况下使用方法,因为这不是 if-statement 。equalIgnoreCase()

java 字符串 switch-statement 相等

评论

4赞 Yassin Hajaj 4/5/2021
很难找到具有所有这些限制的解决方案,为什么不使用 a 而不是 ?if-statementswitch
0赞 Med Elgarnaoui 4/5/2021
String result = userClass.getResult().toUpperCase();
0赞 Jörg 4/5/2021
@user15358848 你是对的,我很快就意识到了。但仅仅删除字符显然并没有删除评论。但现在它似乎已经消失了。
0赞 mi_mo 4/6/2021
@yassin-hajaj 我不想使用 if,因为我经常听到 if 语句降低性能,正是当你使用 if 更多时。是真的吗?

答:

3赞 Ryan 4/5/2021 #1

把逻辑分开一点。首先,将你的状态转换为具有查找函数的 Enum 来查找枚举:

public enum ActionResultStatus {
    SUCCESS("Success"),
    FAIL("Fail"),
    REJECTED("Rejected"),
    IN_PROGESS("InProgress"),
    UNKNOWN("Unknown");
    
    private String outputStr;
    
    private ActionResultStatus(String output) {
        outputStr = output; 
    }
    
    public static ActionResultStatus findStatus(String input) {
        for (ActionResultStatus status : values()) {
            if (input.equalsIgnoreCase(status.outputStr)) {
                return status;
            }
        }
        return UNKNOWN;
    }
    
    public String toString() {
        return outputStr;
    }
}

然后,您的处理逻辑将变为:

ActionResultStatus status = ActionResultStatus.findStatus(userClass.getResult());
switch (status) {
    case FAIL:  fail(); break;
    case SUCCESS: success(); break;
    default: break;
}