我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在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;
}
s1和s2不是String!
我想你不懂Switch语法..
我复制并粘贴错误的部分:)编辑...
s1和s2可以采用什么值?
在每种情况下,您都要为两个变量分配相同的值。为什么不只分配一个,并使s2value等于s1value?
@Apurv a,b,c,d,e,f或g
@ChrisCooney是的,但这只是一个例子,如果我想为一个案例的每个字符串提供不同的值,该怎么办?
我知道了。 道歉。
在您的示例中,您希望执行哪个case? a和g?
@Apurv抱歉没有,因为它破了。 假如s1!="a"和s1!="g"那么就会出现"g"的情况,因为逻辑或者会看到s2 ="g"
如果s1是"g"而s2是"a"怎么办? 那么你期望哪种结果呢?
@EmersonFarrugia如果s1是"g"而s2是"a"那么它将执行大小写"a"然后断开开关,s1Value将为0并且s2Value将为0。
根据您的要求使用单个开关是不可能的。
这与您使用Java一样接近。
switch (s1) {
case"a": doAC(); break;
case"b": doBD(); break;
default:
switch(s2) {
case"c": doAC(); break;
case"d": doBD(); break;
}
}
看到那是我避免的,因为我可能只有两个单独的开关,每个字符串一个:/
两个单独的开关可能会导致代码中的错误,因为doAC()或doBD()将被调用两次。您需要使用嵌套开关,如我所指出的那样。
如果不可能像你说的那样,我只需要梦想有一天我可以使用布尔表达式作为switch语句:)
也是的,我现在看到了,谢谢你指出了!
无需梦想它。查看jcp.org
您是否考虑过不使用switch语句而是使用查找表?
public class MyClass {
private static final Map valuesMap;
static {
Map 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值,那么您可以构建第二个映射来从中获取。
由于你想使用一个开关,我认为这意味着可能的候选者和值是一个固定的,在开发时列表中已知,所以使用这样的静态初始化地图应该不是问题。
使用单个开关执行此操作的唯一方法是首先合并这两个值,找到具有最高优先级的值,然后将开关应用于结果。在您的示例中,s1和s2的最小值,并打开结果。
由于"a"到"g"是一个例子,你需要有一些有意义的方法来首先对真实值进行排名。
您可以在不使用开关的情况下执行您想要的操作,只需编写:
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';
UPDATE
在评论中,你写道:
在进入开关之前s1 ="g"和s2 ="g",那么将评估为真的唯一情况是"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';
它应该做的伎俩,测试它,让我知道它是否有效
与遍历String没有任何关系,我只想在每种情况下检查s1或s2是否为真,然后执行一些语句。
s1和s2不能是true或false,因为它们是字符串而不是布尔值,所以基本上你不能检查字符串是真还是假。告诉我,你的字符串何时应该是真的,何时应该是假的?
好的情况"g"就像是在我的伪说中是否(s1.equals("g")|| s2.equals("g"))。
所以你的"或"在开关中意味着两个字符串必须包含相同的值?
不,如果任何一个字符串是"g",那么它是一个逻辑OR,那么案例"g"将被执行吗?
如果字符串中的任何一个是"a",会发生什么?用你的例子并尝试向我解释,s1 ="g"和s2 ="a",会发生什么以及为什么?
好吧,如果(s1.equals("a")|| s2.equals("a"))判断为真如s2 ="a"那么它将首先测试情况"a"或长形式然后它会将值0分配给s1Value和s2Value并退出交换机。
是的,但我问你如果s1 ="g"和s2 ="a"会发生什么? :)抱歉,如果我继续问你,但我想了解你的问题:)
我解释的是这种情况会发生什么,如果s1 ="a"或s2 ="a",你仍会得到相同的行为:)
是的,但是如果s1 =="g"或s2 =="g"你说你会执行"g"情况,那么正确的是什么?
如果在进入开关之前s1 ="g"且s2 ="g",那么唯一将评估为真的情况是"g",因此s1Value和s2Value都将变为6,然后退出开关。
检查我的更新,如果在进入交换机之前s1和s2相等,一切都会轻松很多,在你的例子中,你用不同的值初始化了s1和s2。如果我误解了另一次,试着更清楚地让我更好地理解你的问题:)
这是另一个例子:s1 ="f"和s2 ="d"情况"d"首先被检查并且评估为真,因为s2 ="d"然后s1Value和s2Value被赋值为3然后我们退出开关。
所以你要检查2个字符串中a,b,c,d,e,f,g之间的字符是否较低,然后更新s1Value和s2Value?
即s1 ="a"s2 ="c",case ="a"; s1 ="d"s2 ="b",case ="b";我对吗?
嗯......在这个例子中,你可以说它有那些语义,但更普遍地想一想......说这些字母不是有序的,例如"hello"将1分配给s1Value而34分配给s2Value :)和是的你是对的:)
"我想用开关来实现的那种东西。" - 谢谢你的输入虽然:)
检查我的第二次更新,你不需要使用switch-case来做到这一点
我知道你没有,说实话,我可以用if / else实现这一切,但我想知道Java是否有能力使用交换机实现我想要的功能。
在这种情况下,不,你不能用一个开关盒做到这一点