Kotlin中从字符串提取首尾单词的最优实现方案(含多空格场景)
解决方案:提取字符串首尾单词(适配多空格/首尾空格场景)
这个问题的核心是你的拆分方式没处理连续空格和首尾空格带来的空字符串元素,咱们调整下代码,就能完美覆盖你列出的所有测试场景:
优化后的代码
fun extractNames(displayName: String): Pair<String?, String?> { // 先去除首尾所有空白字符,从根源避免末尾空格生成空元素 val trimmedName = displayName.trim() // 处理空输入的边界情况 if (trimmedName.isEmpty()) { return Pair(null, null) } // 用正则匹配一个或多个空白字符拆分,规避连续空格产生空元素 val nameParts = trimmedName.split("\\s+".toRegex()) val firstName = nameParts.first() val lastName = nameParts.last() return Pair(firstName, lastName) } // 测试所有场景 fun main() { val testScenarios = listOf( "Vivek Modi", "Vivek Modi ", "Vivek Modi", "Vivek Modi ", "Vivek XYZ Modi " ) testScenarios.forEach { input -> val (first, last) = extractNames(input) println("*** displayName: '$input'") println("*** firstName : $first") println("*** lastName : $last") println("------------------------") } }
代码说明
trim():去掉字符串首尾的所有空白字符(包括空格、换行符等),直接避免了末尾空格导致拆分出空字符串的问题;split("\\s+".toRegex()):用正则表达式\\s+匹配一个或多个连续空白字符作为分隔符,不管中间有多少个空格,都会被当成一个分隔符处理,拆分后的列表不会出现空字符串;- 边界处理:加入空输入判断,避免空字符串拆分时出现异常。
原代码问题分析
你之前用split(" ")拆分,会把每个单独的空格都当成分隔符:
- 比如输入
"Vivek Modi "会被拆成["Vivek", "Modi", ""],移除第一个元素后剩下["Modi", ""],lastOrNull()自然拿到空字符串; - 连续空格场景(比如
"Vivek Modi")会拆出["Vivek", "", "Modi"],虽然偶尔能拿到正确结果,但逻辑存在隐患。
用上面的优化方案,所有测试场景都会输出预期结果:firstName = Vivek,lastName = Modi
内容的提问来源于stack exchange,提问作者Vivek Modi
相关产品推荐
相关产品推荐

