如何使用Kotlin将嵌套的if-else语句更改为when语句?
我有下面的代码块,希望使用Kotlin减少它。我该怎么做如何使用Kotlin将嵌套的if-else语句更改为when语句?,kotlin,Kotlin,我有下面的代码块,希望使用Kotlin减少它。我该怎么做 if (name == nameArray[0]) { // The statement } else if(name == nameArray[1]) { // The statement } else if(name == nameArray[2]) { // The statement } else if(name == nameArray[3]) { // The statement } else
if (name == nameArray[0]) {
// The statement
} else if(name == nameArray[1]) {
// The statement
} else if(name == nameArray[2]) {
// The statement
} else if(name == nameArray[3]) {
// The statement
} else {
// The statement
}
更短的方法:迭代数组而不是
if
-else
数组的每个可能索引:
fun main(args: Array<String>) {
val nameArray: Array<String> = arrayOf("naam", "nombre", "name", "Name")
val name: String = "name";
for (i in 0..(nameArray.size - 1)) {
if (name == nameArray[i]) {
println("The statement should be executed on index " + i)
}
}
}
如果数组很小,并且希望将操作映射到每个索引:
when(name) {
nameArray[0] -> // do something
nameArray[1] -> // do something
nameArray[2] -> // do something
nameArray[3] -> // do something
else -> // other action
}
你可以用它来确定你身体状况的最小指数。然后您可以使用when
语句来决定要做什么
when(nameArray.indexOfFirst{ it == name }) {
0 -> // do something
1 -> // do something else
//...
else -> // do something different
}
如果您可能希望对多个索引执行相同的操作,可以使用逗号分隔的值。如果索引是连续的,则可以使用范围:
when(nameArray.indexOfFirst{ it == name }) {
0 -> // do something
1, 2 -> // do the same thing for 1 and 2
in 3..6 -> // do the same thing for 3, 4, 5 and 6
//...
else -> // do something different
}
为了使用这种语法,最好先进行索引检索(如图所示)
如果数组很大,而您确实只想检查特定元素:
when(name) {
nameArray[0] -> // do something
nameArray[1] -> // do something
nameArray[2] -> // do something
nameArray[3] -> // do something
else -> // other action
}
您可以在时使用
,将其简化如下
when(name) {
nameArray[0] -> //statement
nameArray[1] -> //statement
nameArray[2] -> //statement
nameArray[3] -> //statement
else -> //statement
}
或者,如果您可以使用枚举而不是下面的nameArray
enum class Names {
NAME_1, NAME_2, NAME_3
}
并且拥有Names
enum类型的name
,然后可以使用下面的when
子句,这是一种更简洁的方式,更具可读性
when(name) {
Names.NAME_1 -> //statement
Names.NAME_2 -> //statement
Names.NAME_3 -> //statement
}
您可以使用更好、更强大的Kotlin构造,when
它的工作原理与switch-case构造类似,但您也可以使用expression,查看更多信息
针对您的示例,您可以编写:
when (name) {
nameArray[0] -> {
//The statement
}
nameArray[1] -> {
//The statement
}
nameArray[2] -> {
//The statement
}
nameArray[3] -> {
//The statement
}
else -> {
//Executes when conditions are not met
}
}
也许我误解了你想要做的事情,但在我看来,当一个陈述过于复杂化时。在原始代码中,您只需要确定数组是否在0到3的任何索引中包含name
值,并做出相应的响应
if ((nameArray.indexOfFirst(name::equals) in 0..3) {
// The statement
} else {
// The else branch
}
你真的要在数组中检查同一个索引三次吗?还是打字错误?这里嵌套了什么?好的,现在修复了它。这回答了你的问题吗?您可以反过来迭代nameArray
,因为name
保持不变,不是吗?您能否提供一个最小的示例和nameArray
的确切类型?您可以在0中使用i,直到nameArray
而不是0..(nameArray.size-1)
,它不短,但可能更容易阅读:)@WilliMentzel关于nameArray.indexes
?@xinaiz或者更好的用于机械索引的:)@WilliMentzel也可以使用迭代器。。。科特林有很多可能性;-)我承认,它们中的大多数都比我的示例更具可读性……在最坏的情况下(假设数组有一百万个项,匹配项是最后一个)nameArray.indexOfFirst{it==name}
将花费您3、4次以上的简单比较,如question@mightyWOZ是的,但是要为每一种情况列出一项行动是不可行的(使用when
您似乎建议的内容)也可以。答案是根据问题及其用例量身定制的。它应该简短明了。首先,问题没有说明数组的大小。(可以是5或5000000)第二,这个问题只涉及五种情况,而不考虑数组的大小,这可以由when@mightyWOZ好的,我明白你的意思了。我在想OP想要覆盖数组的所有情况(因为它从零开始,有连续的索引)(这意味着它不会那么大)。不过,如果数组不是很大,我很可能会同意我的建议,特别是因为答案的第二部分。无论如何,谢谢你的评论。问题并不完全清楚,但他可能想为不同的索引做不同的事情。