【问题标题】:Java switch statement to handle two variables?Java switch 语句来处理两个变量?
【发布时间】:2013-02-19 19:14:50
【问题描述】:

我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在 Java 中是不可能的。

这里有一些伪代码,我只想通过开关来实现。

    int s1Value = 0;
    int s2Value = 0;
    String s1 = "a";
    String s2 = "g";
    switch (s1 || s2) {
         case "a": s1value = 0; s2value = 0; break;
         case "b": s1value = 1; s2value = 1; break;
         case "c": s1value = 2; s2value = 2; break;
         case "d": s1value = 3; s2value = 3; break;
         case "e": s1value = 4; s2value = 4; break;
         case "f": s1value = 5; s2value = 5; break;
         case "g": s1value = 6; s2value = 6; break;
    }

【问题讨论】:

  • s1s2 不是 String
  • 我觉得你不懂Switch syntax..
  • 我复制并粘贴了错误的部分 :) 已编辑...
  • s1s2 可以取什么值?
  • 在每种情况下,您都为两个变量分配了相同的值。为什么不只分配一个,并使 s2value 等于 s1value?

标签: java variables int logic switch-statement


【解决方案1】:

不可能根据您的要求使用单个开关。 这与您将要使用 Java 一样接近。

    switch (s1)  {
        case "a":  doAC(); break;
        case "b":  doBD(); break;
        default:
            switch(s2) {
                case "c":  doAC(); break;
                case "d":  doBD(); break;
            }
   }        

【讨论】:

  • 看那是我所避免的,因为我可能只有两个单独的开关,每个 String 一个:/
  • 两个单独的开关可能会导致代码中的错误,因为 doAC() 或 doBD() 将被调用两次。正如我所指出的,您需要使用嵌套开关。
  • 如果不可能像你说的那样,我只能梦想有一天我可以使用布尔表达式作为 switch 语句:)
【解决方案2】:

您是否考虑过不使用 switch 语句而是使用查找表?

public class MyClass {
    private static final Map<String, Integer> valuesMap;

    static {
         Map<String,Integer> aMap = new HashMap<>();
         aMap.put("a", 0);
         aMap.put("b", 1);
              ..... rest .....
         valuesMap = Collections.unmodifiableMap(aMap);
    }

    public void foo()
    {
       int s1Value = 0;
       int s2Value = 0;

       String s1 = "a";
       String s2 = "g";
       if( valuesMap.containsKey(s1) )
       {
          s1Value = valuesMap.get(s1);
          s2Value = s1Value;
       }
       else if( valuesMap.contansKey(s2) )
       {
          s1Value = valuesMap(s2);
          s2Value = s1Value;
       }
    }
}

如果您需要一组不同的 s2Value 值,那么您可以构建第二张地图来从中提取这些值。

由于您想使用 switch,我认为这意味着可能的候选者和值是固定的,在开发时已知的列表,因此使用像这样的静态初始化地图不应该是问题。

【讨论】:

    【解决方案3】:

    使用单个 switch 执行此操作的唯一方法是首先合并两个值,找到具有最高优先级的值,然后将 switch 应用于结果。在您的示例中,s1 和 s2 的最小值,并打开结果。

    由于“a”到“g”是一个示例,您需要有一些有意义的方法来首先对实际值进行排名。

    【讨论】:

      【解决方案4】:

      你可以在不使用开关的情况下做你想做的事,只需写下:

      s1value = s1.charAt(0)-'a'; //returns 0 if s1value="a", 1 if s1value="b", etc.
      

      我不完全明白你的意思是什么

      (s1 || s2)
      

      你想做这样的事情吗?

        int s1Value = 0;
        int s2Value = 0;
      
        String s1 = "g";
        String s2 = "a";
      
        char s1char = s1.charAt(0);
        char s2char = s2.charAt(0);
        int myChar = Math.max(s1char, s2char);
        s1Value = s2Value = myChar - 'a';
      

      更新

      在 cmets 中,您写道:

      s1="g" 和 s2="g" 在进入 switch 之前,唯一会评估为 true 的 case 是 case "g",所以 s1Value 和 s2Value 都会变成 6 然后退出 switch .

      所以,我认为您是说 s1 和 s2 使用相同的值进行初始化,所以:

        int s1Value = 0;
        int s2Value = 0;
      
        String s1 = "g";
        String s2 = "g";
      
        char s1char = s1.charAt(0);
        s1Value = s2Value = s1char - 'a'; //s1Value = s2Value = 6
      

      这应该做你想做的事

      更新 2

      对于 s1="a" 和 s2="d",我们考虑案例 "a",对于 s1="c" 和 s2="b",我们考虑案例 "b"

      试试这个:

        int s1Value = 0;
        int s2Value = 0;
      
        String s1 = "g";
        String s2 = "a";
      
        char s1char = s1.charAt(0);
        char s2char = s2.charAt(0);
        int myChar = Math.min(s1char, s2char);
        s1Value = s2Value = myChar - 'a';
      

      它应该可以解决问题,测试它并让我知道它是否有效

      【讨论】:

      • 与遍历字符串无关,我只是想在每种情况下检查 s1 或 s2 是否为真,如果是,则执行一些语句。
      • s1 和 s2 不能为真或假,因为它们是字符串而不是布尔值,所以基本上你无法检查字符串是真还是假。告诉我,你的字符串什么时候应该是真的,什么时候应该是假的?
      • 好吧 case "g" 就像在我的伪中说 if(s1.equals("g") || s2.equals("g")) 。
      • 所以你在开关中的“或”意味着两个字符串必须包含相同的值?
      • 不,如果其中一个字符串是“g”,那么它是逻辑或,那么情况“g”将被执行?
      【解决方案5】:

      scala&amp;python 这样的语言给你提供了像patternMatching 这样非常强大的东西,不幸的是这仍然是Java 中缺少的功能......

      但是有一个解决方案(在大多数情况下我不喜欢),你可以这样做:

      final int s1Value = 0;
      final int s2Value = 0;
      final String s1 = "a";
      final String s2 = "g";
      
      switch (s1 + s2 + s1Value + s2Value){
          case "ag00": return true;
          default: return false;
      }
      

      【讨论】:

        【解决方案6】:

        基本上,如果您有 N 个真实状态,请将它们设置为字节数组 (ceil(N/8)) 中的位,并使用长表示形式创建案例。 ByteBuffer 换行可能会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-17
          • 1970-01-01
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多