java switch不做处理_Java switch语句处理两个变量?

我正在寻找一种使用单个开关处理两个字符串的方法,我认为这在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是否有能力使用交换机实现我想要的功能。

在这种情况下,不,你不能用一个开关盒做到这一点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值