Kotlin中不区分大小写的字符串

nom7f22z  于 2023-04-12  发布在  Kotlin
关注(0)|答案(2)|浏览(252)

我有一个字符串集合,我不关心大小写敏感性。目前,每当我将一个新项目放入列表中时,我都会放入item.toLowerCase(),每当我比较值时,我都会使用contains(item.toLowerCase())
有没有一种方法可以做到这一点,而不会有忘记小写字母的风险?我不能扩展String类,因为它是final的,否则我会尝试类似Collection<LowerCaseString>的东西。
有没有一个适当的方法来实现这一点?

zwghvu4y

zwghvu4y1#

如果你不想创建自己的自定义集合类型,而不是子类化String,正如你所说的,你不能这样做,你可以创建一个 Package 器值类,在那里你强制 Package 的字符串是小写的。例如:

@JvmInline
value class LowercaseString private constructor(val wrapped: String) {
    companion object {
        fun from(string: String) = LowercaseString(string.lowercase())
    }
}

当然,这有一个不方便之处,它需要从String手动 Package 和展开。

lb3vh1jj

lb3vh1jj2#

正如你所注意到的,你目前的方法很容易出错,我敢打赌你已经踩过几次了:)为了解决这个问题,你可以创建自定义容器,它会自动处理这个问题,这样你就不再需要在插入之前规范化你的数据(或其他任何东西)。然后你应该更新你的代码来使用这个类,而不是你目前使用的List

class CaseInsensitiveList(
    private val innerList: MutableList<String> = mutableListOf()
) : MutableList<String> by innerList {

    override fun add(element: String) = innerList.add(element.toLowerCase())
    override fun add(index: Int, element: String) {
        innerList.add(index, element.toLowerCase())
    }
    override fun addAll(index: Int, elements: Collection<String>) =
        innerList.addAll(index, elements.map { it.toLowerCase() })

    override fun set(index: Int, element: String) =
        innerList.set(index, element.toLowerCase())

    override fun contains(element: String) =
        innerList.contains(element.toLowerCase())

    override fun indexOf(element: String) =
        innerList.indexOf(element.toLowerCase())

    override fun lastIndexOf(element: String) =
        innerList.lastIndexOf(element.toLowerCase())

    override fun containsAll(elements: Collection<String>) =
        elements.all { this.contains(it) }
}

我们只需要覆盖那些需要不区分大小写处理或修改的方法。

相关问题