Java 输入不固定时如何避免switch语句?
我已经写了下面的代码Java 输入不固定时如何避免switch语句?,java,switch-statement,Java,Switch Statement,我已经写了下面的代码 public enum ProcessEnums { ASSIGNMENT, CREDIT,HOWMANY,HOWMUCH,ERROR; } public final class StringConstants { public static final String Error = "I have no idea what you are talking about"; public static final String rgxAssignment =
public enum ProcessEnums {
ASSIGNMENT, CREDIT,HOWMANY,HOWMUCH,ERROR;
}
public final class StringConstants {
public static final String Error = "I have no idea what you are talking about";
public static final String rgxAssignment = "^([a-z]+) is ([I|V|X|L|C|D|M])$";
public static final String rgxCredits = "((?:[a-z]+ )+)([A-Z]\\w+) is (\\d+) ([A-Z]\\w+)$";
public static final String rgxHowMany= "^how many ([a-zA-Z]\\w+) is ((?:\\w+ )+)([A-Z]\\w+) \\?$";
public static final String rgxHowMuch = "^how much is ((?:\\w+[^0-9] )+)\\?$";
}
private ProcessEnums checkMessage(String line) {
ProcessEnums flag = ProcessEnums.ERROR;
String[] rgxArray = new String[] { rgxAssignment, rgxCredits,
rgxHowMany, rgxHowMuch };
for (int i = 0; i < rgxArray.length; i++) {
Pattern ptn = Pattern.compile(rgxArray[i]);
Matcher mcher = ptn.matcher(line);
if (mcher.matches()) {
switch (i) {
case 0:
return ProcessEnums.ASSIGNMENT;
case 1:
return ProcessEnums.CREDIT;
case 2:
return ProcessEnums.HOWMANY;
case 3:
return ProcessEnums.HOWMUCH;
default:
break;
}
}
}
return flag;
}
公共枚举进程枚举{
分配,信用,多少,多少,错误;
}
公共最终类字符串常量{
public static final String Error=“我不知道你在说什么”;
公共静态最终字符串rgxAssignment=“^([a-z]+)是([I|V|X|L|C|D|M])”;
公共静态最终字符串rgxCredits=“((?:[a-z]+)+)([a-z]\\w+)是(\\d+)([a-z]\\w+)”;
公共静态最终字符串rgxHowMany=“^a-zA-Z]\\w+是多少((?:\\w+)([a-Z]\\w+\?$”;
公共静态最终字符串rgxhowmount=“^What mound is((?:\\w+[^0-9])+)\?$”;
}
私有进程枚举检查消息(字符串行){
ProcessEnums标志=ProcessEnums.ERROR;
字符串[]rgxArray=新字符串[]{rgxAssignment,rgxCredits,
rgxhowmone,rgxhowmone};
对于(int i=0;i
正如您所看到的,我在CheckMessageAPI中没有得到固定的输入。我如何在没有开关块的情况下实现这一点。我已经想过使用Map,但我没有任何固定的标识符作为输入字符串
准确地说,我正在寻找一种解决方案,不必在枚举列表上迭代将代码放入枚举
使用异常
对于异常情况,不要使用标记值<代码>异常存在是有原因的
这还允许您添加新模式,而无需更改代码
注意迭代的顺序将是声明的顺序,更具体的模式需要先执行
最后,
ProcessEnum.values()
将在每次调用时返回ProcessEnum[]
的新副本。为了提高效率,您可能希望将其缓存在静态final
变量中。我们仍在迭代各种可能性?我一直在寻找解决方案,我不必重复所有的问题enums@Sach由于您的代码依赖于正则表达式来检测输入的类型,因此无法绕过这一点-您必须迭代正则表达式并测试每个表达式。如果您不想这样做,您需要重新思考您的核心逻辑。@BoristSpider如何在Java 6或7上解决这个问题。版本中没有Lambda表达式。@TienNguyen在编写时没有Lambda表达式。@BoristheSpider:我的基本要求是,当消息传入时,我需要对其进行处理。字符串中有明确的值,这就是我使用正则表达式的原因。我已经厌倦了这些方法,所以我想在这个问题上放弃一个问题,当你对答案投了赞成票时改变你的问题是非常不礼貌的。我还没有投反对票。当我看到你的回答时,我的回答被否决了。尽管如此,礼仪还是很糟糕。这意味着我为答案付出的努力基本上是白费的。社区为阅读你的问题和我的答案所付出的努力都白费了。这进一步意味着这个问题对未来毫无用处,这是SO的核心设计原则。请确保你再也不要这样做了。@Sach这并不意味着你对答案投了高票。由于答案是向上投票的,因此改变问题会使答案和作者所付出的努力无效。
public enum ProcessEnum implements Predicate<String> {
ASSIGNMENT("^([a-z]+) is ([I|V|X|L|C|D|M])$"),
CREDIT("((?:[a-z]+ )+)([A-Z]\\w+) is (\\d+) ([A-Z]\\w+)$"),
HOWMANY("^how many ([a-zA-Z]\\w+) is ((?:\\w+ )+)([A-Z]\\w+) \\?$"),
HOWMUCH("^how much is ((?:\\w+[^0-9] )+)\\?$");
private final Pattern patt;
ProcessEnum(final String regex) {
this.patt = Pattern.compile(regex);
}
@Override
public boolean test(final String s) {
return patt.matcher(s).matches();
}
}
private ProcessEnum checkMessage(String line) {
return Arrays.stream(ProcessEnum.values())
.filter(pe -> pe.test(line))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("I have no idea what you are talking about"));
}