11

我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在 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;
    }
4

6 回答 6

8

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

    switch (s1)  {
        case "a":  doAC(); break;
        case "b":  doBD(); break;
        default:
            switch(s2) {
                case "c":  doAC(); break;
                case "d":  doBD(); break;
            }
   }        
于 2013-03-05T12:11:16.850 回答
5

您是否考虑过不使用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值,那么您可以构建第二个映射来从中提取这些值。

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

于 2013-03-05T13:57:48.320 回答
4

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

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

于 2013-03-05T12:16:31.070 回答
1

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

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';

更新

在评论中,您写道:

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';

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

于 2013-03-05T12:02:35.227 回答
1

像这样的语言scala&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;
}
于 2021-01-19T14:17:54.630 回答
0

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

于 2020-08-13T10:18:26.357 回答