我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在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;
}
答案 0 :(得分:8)
无法根据您的要求使用单个开关。 这与您使用Java一样接近。
switch (s1) {
case "a": doAC(); break;
case "b": doBD(); break;
default:
switch(s2) {
case "c": doAC(); break;
case "d": doBD(); break;
}
}
答案 1 :(得分:4)
使用单个开关执行此操作的唯一方法是首先合并两个值,找到具有最高优先级的值,然后将开关应用于结果。在您的示例中,s1和s2的最小值,并打开结果。
由于“a”到“g”就是一个例子,你需要有一些有意义的方法来首先对真实值进行排名。
答案 2 :(得分:4)
您是否考虑过不使用开关语句,而是使用查找表?
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 值,那么你可以构建第二张地图来拉动它们。
由于您想使用开关,我认为这意味着可能的候选者和值是固定的,在开发时列表中已知,因此使用这样的静态初始化地图不应该是问题。
答案 3 :(得分: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”,那么唯一将评估为true的情况是“g”,因此s1Value和s2Value都将变为6然后退出开关的
所以,我认为你说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';
它应该做的伎俩,测试它,让我知道它是否有效
答案 4 :(得分:0)
基本上,如果您有N个真实状态,则将它们设置为字节数组(ceil(N / 8))中的位,并使用长表示法创建案例。 ByteBuffer包装可能会有所帮助。
答案 5 :(得分:0)
像 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;
}