区分大小写Kotlin / ignoreCase

时间:2018-03-18 15:30:23

标签: kotlin case-insensitive

我试图忽略字符串的区分大小写。例如,用户可以放置“巴西”或“巴西”,乐趣将触发。我该如何实现?我是Kotlin的新手。

fun questionFour() {
    val edittextCountry = findViewById<EditText>(R.id.editTextCountry)
    val answerEditText = edittextCountry.getText().toString()

    if (answerEditText == "Brazil") {
        correctAnswers++
    }

    if (answerEditText == "Brasil") {
        correctAnswers++
    }
}

修改

另一个人帮我写了这样的话。我现在关于这种方式的问题是“有没有更清晰的方法来写这个?”

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++
        }
    }

3 个答案:

答案 0 :(得分:10)

您可以直接调用equals函数,这样您就可以指定可选参数ignoreCase

if (answerEditText.equals("brasil", ignoreCase = true)) {
    correctAnswers++
}

答案 1 :(得分:3)

核心问题是<code> Widget bindMedium(BuildContext context, AsyncSnapshot snapshot) { _medium = snapshot.data["data"]["medium"]; return new ListView.builder( itemCount: _medium == null ? 0 : _medium.length, itemBuilder: (BuildContext context, int index) { return new CheckboxListTile( title: new Text(_medium[index]["medium"]), value: _medium[index]["selected"], onChanged: (bool newValue) { setState(() => _medium[index]["selected"] = newValue); }, ); }, ); } Widget bindClass(BuildContext context, AsyncSnapshot snapshot) { _classes = snapshot.data["data"]["classes"]; return new Container( child: new ListView.builder( itemCount: _classes == null ? 0 : _classes.length, itemBuilder: (BuildContext context, int index) { return new CheckboxListTile( title: new Text(_classes[index]["class"]), value: _classes[index]["selected"], onChanged: (bool newValue) { print("New Value ::" + _classes[index]["selected"].toString()); _classes[index]["selected"] = true; }, ); }, )); } </code> 只是调用==,这是区分大小写的。有几种方法可以解决这个问题:

1)小写输入并直接比较:

equals()

这很容易理解和维护,但如果你有多个答案,那就太笨重了。

2)小写输入并测试集合中的值:

if (answerEditText.toLowerCase() == "brasil" ||
    answerEditText.toLowerCase() == "brazil") {
    // Do something
}

也许将某个集合定义为一个常量(在一个伴随对象中?),以避免重新创建它几次。这很好,很清楚,当你有很多答案时很有用。

3)忽略大小写并通过if (answerEditText.toLowerCase() in setOf("brasil", "brazil")) { // Do Something } 方法进行比较:

.equals()

与选项1类似,当您只有一双应对的答案时很有用。

4)使用不区分大小写的正则表达式:

if (answerEditText.equals("Brazil", true) ||
    answerEditText.equals("Brasil", true)) {
    // Do something
}

再次创建val answer = "^Bra(s|z)il$".toRegex(RegexOption.IGNORE_CASE) if (answer.matches(answerEditText)) { // Do something } 正则表达式并将其存储在某处以避免重新创建。我觉得这是一个矫枉过正的解决方案。

答案 2 :(得分:1)

我们创建并使用了扩展功能,因此可以避免指定第二个参数。

fun String.equalsIgnoreCase(other: String?): Boolean {
    if (other == null) {
        return false
    }

    return this.equals(other, true)
}

println("California".equalsIgnoreCase("CALIFORNIA"))