区分大小写 Kotlin / ignoreCase
Case Sensitivity Kotlin / ignoreCase
我试图忽略字符串的大小写敏感性。例如,用户可以输入 "Brazil" 或 "brasil",然后就会触发乐趣。我该如何实施?我是科特林的新手。
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText == "Brazil") {
correctAnswers++
}
if (answerEditText == "Brasil") {
correctAnswers++
}
}
编辑
另外一个人帮我这样写的。我现在关于这种方式的问题是 "Is there a cleaner way to write this?"
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText.toLowerCase() == "Brazil".toLowerCase() || answerEditText.toLowerCase() == "Brasil".toLowerCase()) {
correctAnswers++
}
}
回答
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText.equals("brasil", ignoreCase = true) || answerEditText.equals("brazil", ignoreCase = true)) {
correctAnswers++
}
}
核心问题是 ==
只是调用 equals()
,区分大小写。有几种方法可以解决这个问题:
1) 小写输入并直接比较:
if (answerEditText.toLowerCase() == "brasil" ||
answerEditText.toLowerCase() == "brazil") {
// Do something
}
这很容易理解和维护,但如果您有多个答案,它就会变得笨拙。
2) 小写输入并测试一组值:
if (answerEditText.toLowerCase() in setOf("brasil", "brazil")) {
// Do Something
}
也许在某处(在伴随对象中?)将集合定义为常量以避免重新创建它几次。这很好,很清楚,当你有很多答案时很有用。
3) 忽略大小写,通过.equals()
方法比较:
if (answerEditText.equals("Brazil", true) ||
answerEditText.equals("Brasil", true)) {
// Do something
}
类似于选项 1,当您只有一大堆答案要处理时很有用。
4) 使用不区分大小写的正则表达式:
val answer = "^Bra(s|z)il$".toRegex(RegexOption.IGNORE_CASE)
if (answer.matches(answerEditText)) {
// Do something
}
再次创建 answer
正则表达式一次并将其存储在某处以避免重新创建。我觉得这是一个矫枉过正的解决方案。
您可以直接调用equals
函数,这将允许您指定可选参数ignoreCase
:
if (answerEditText.equals("brasil", ignoreCase = true)) {
correctAnswers++
}
我们创建了扩展函数并使用它,这样我们就可以避免指定第二个参数。
fun String.equalsIgnoreCase(other: String?): Boolean {
if (other == null) {
return false
}
return this.equals(other, true)
}
println("California".equalsIgnoreCase("CALIFORNIA"))
我试图忽略字符串的大小写敏感性。例如,用户可以输入 "Brazil" 或 "brasil",然后就会触发乐趣。我该如何实施?我是科特林的新手。
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText == "Brazil") {
correctAnswers++
}
if (answerEditText == "Brasil") {
correctAnswers++
}
}
编辑
另外一个人帮我这样写的。我现在关于这种方式的问题是 "Is there a cleaner way to write this?"
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText.toLowerCase() == "Brazil".toLowerCase() || answerEditText.toLowerCase() == "Brasil".toLowerCase()) {
correctAnswers++
}
}
回答
fun questionFour() {
val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
val answerEditText = edittextCountry.getText().toString()
if (answerEditText.equals("brasil", ignoreCase = true) || answerEditText.equals("brazil", ignoreCase = true)) {
correctAnswers++
}
}
核心问题是 ==
只是调用 equals()
,区分大小写。有几种方法可以解决这个问题:
1) 小写输入并直接比较:
if (answerEditText.toLowerCase() == "brasil" ||
answerEditText.toLowerCase() == "brazil") {
// Do something
}
这很容易理解和维护,但如果您有多个答案,它就会变得笨拙。
2) 小写输入并测试一组值:
if (answerEditText.toLowerCase() in setOf("brasil", "brazil")) {
// Do Something
}
也许在某处(在伴随对象中?)将集合定义为常量以避免重新创建它几次。这很好,很清楚,当你有很多答案时很有用。
3) 忽略大小写,通过.equals()
方法比较:
if (answerEditText.equals("Brazil", true) ||
answerEditText.equals("Brasil", true)) {
// Do something
}
类似于选项 1,当您只有一大堆答案要处理时很有用。
4) 使用不区分大小写的正则表达式:
val answer = "^Bra(s|z)il$".toRegex(RegexOption.IGNORE_CASE)
if (answer.matches(answerEditText)) {
// Do something
}
再次创建 answer
正则表达式一次并将其存储在某处以避免重新创建。我觉得这是一个矫枉过正的解决方案。
您可以直接调用equals
函数,这将允许您指定可选参数ignoreCase
:
if (answerEditText.equals("brasil", ignoreCase = true)) {
correctAnswers++
}
我们创建了扩展函数并使用它,这样我们就可以避免指定第二个参数。
fun String.equalsIgnoreCase(other: String?): Boolean {
if (other == null) {
return false
}
return this.equals(other, true)
}
println("California".equalsIgnoreCase("CALIFORNIA"))