【问题标题】:convert if-else to switch statements java将 if-else 转换为 switch 语句 java
【发布时间】:2024-05-20 11:50:02
【问题描述】:

我正在尝试为地址解析器创建 switch 语句,它通过正则表达式解析字符串,但我遇到了困难。

我的挑战是这部分:

if(m.matches() && i==0){
            b.street(m.group(1));
            break;

如何把它变成

switch(SOMETHINGHERE) {
case SOMETHINGHERE: SOMECODE HERE
}

这是正则表达式和patternList,它是一个Arraylist(或Linkedlist,我还没决定:

static String streetReg = "([a-zæøåäöëüéèA-ZÆØAÄÖËÜÉÈ -./]*)";
static String symbolsReg = "[ ,.-]*";

public static void addPatterns() {
        patternList.add(Pattern.compile(streetReg + "" + symbolsReg));
    }

如何将以下内容转换为 switch 语句?

public static Address parse(String s) {
    addPatterns();
    Builder b = new Builder();
    boolean noMatch = false;
    for(int i = 0; i<patternList.size(); i++){
        Matcher m = patternList.get(i).matcher(s);

        if(m.matches() && i==0){
            b.street(m.group(1));
            break;
        }
        else if(m.matches() && i==1){
            b.street(m.group(1));
            b.city(m.group(2));
            break;
        }else if(m.matches() && i==2) {
            b.postcode(m.group(1));
            b.city(m.group(2));
            break;
        }else if(m.matches() && i== 3){
            b.street(m.group(1));
            b.house(m.group(2));
            b.city(m.group(3));
            break;

我试过这样做:

        switch (s){
            case "st":
                b.street(m.group(1));
                break;
            case "street and house":
                b.street(m.group(1));
                b.street(m.group(2));
                break;
            case "noMatch":
                noMatch =true;
                break;
        }
    }
if(noMatch)return null;
else return b.build();
}

但我收到一个错误,即为开关选择的类型和大小写不匹配。例如boolean vs int 或 string vs int..

【问题讨论】:

  • switch (s)中的's'是什么@
  • s 将是来自公共静态地址解析(字符串 s)的 s
  • 我知道如何使用 String 进行切换,但我不确定如何转换: if(m.matches() && i==0){ b.street(m.group(1 ));休息;到一个开关 (SOMETHING) { case SOMETHING: }
  • @leroyjenkins 显示转换后您尝试的整个方法的代码

标签: java parsing if-statement design-patterns switch-statement


【解决方案1】:
if ( m.matches()) {
 switch(i) {
    case 0: b.street(m.group(1));
            checkNewVariable = true;
            break; // WARNING!! this break is a break for the switch, not for the FOR loop
    // you'll need to add a variable (checkNewVariable) so you can break after the switch if needed
   case 1: b.street(m.group(1));
           b.city(m.group(2));
           checkNewVariable = true;
           break;
// ... rest of your cases

  }

  if ( checkNewVariable ) { break; } // to break out of the for loop
}

是一种选择。

【讨论】:

  • 我会努力的!我不确定开关采用什么参数(s 或 m.matches() 或 i)!!
  • 是否有可能使 public static void addPatterns() { patternList.add(Pattern.compile(streetReg + "" + symbolsReg)); } 作为链表而不是数组表?
  • 我认为是的。
  • 开关可以将 s 作为参数,但不能将 m.matches() (这返回一个布尔值)。我也是一个选项。我只是从您的原始代码开始,并以此为基础。从您的代码中,我可以看到您当前检查的 i 的值,而不是 s。
  • 我基本上是在尝试使这个函数匹配具有不同模式的输入字符串。如果模式匹配,它将使用给定的信息创建一个地址对象。