我有一个字符串集合,我不关心大小写敏感性。目前,每当我将一个新项目放入列表中时,我都会放入item.toLowerCase(),每当我比较值时,我都会使用contains(item.toLowerCase())。有没有一种方法可以做到这一点,而不会有忘记小写字母的风险?我不能扩展String类,因为它是final的,否则我会尝试类似Collection<LowerCaseString>的东西。有没有一个适当的方法来实现这一点?
item.toLowerCase()
contains(item.toLowerCase())
Collection<LowerCaseString>
zwghvu4y1#
如果你不想创建自己的自定义集合类型,而不是子类化String,正如你所说的,你不能这样做,你可以创建一个 Package 器值类,在那里你强制 Package 的字符串是小写的。例如:
String
@JvmInline value class LowercaseString private constructor(val wrapped: String) { companion object { fun from(string: String) = LowercaseString(string.lowercase()) } }
当然,这有一个不方便之处,它需要从String手动 Package 和展开。
lb3vh1jj2#
正如你所注意到的,你目前的方法很容易出错,我敢打赌你已经踩过几次了:)为了解决这个问题,你可以创建自定义容器,它会自动处理这个问题,这样你就不再需要在插入之前规范化你的数据(或其他任何东西)。然后你应该更新你的代码来使用这个类,而不是你目前使用的List:
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) } }
我们只需要覆盖那些需要不区分大小写处理或修改的方法。
2条答案
按热度按时间zwghvu4y1#
如果你不想创建自己的自定义集合类型,而不是子类化
String
,正如你所说的,你不能这样做,你可以创建一个 Package 器值类,在那里你强制 Package 的字符串是小写的。例如:当然,这有一个不方便之处,它需要从
String
手动 Package 和展开。lb3vh1jj2#
正如你所注意到的,你目前的方法很容易出错,我敢打赌你已经踩过几次了:)为了解决这个问题,你可以创建自定义容器,它会自动处理这个问题,这样你就不再需要在插入之前规范化你的数据(或其他任何东西)。然后你应该更新你的代码来使用这个类,而不是你目前使用的
List
:我们只需要覆盖那些需要不区分大小写处理或修改的方法。