kotlin 将字符串拆分为长度为1的单个字符串:如何避免空字符串?

wkftcu5l  于 2023-05-23  发布在  Kotlin
关注(0)|答案(4)|浏览(230)
val segm = str.split("")
        // .filter { it -> it.length > 0 }
println(segm)

将“Testing 1234”作为“str”,我得到“[,T,e,s,t,i,n,g,1,2,3,4,]”
有了额外的过滤器,它就能工作了。但无论如何:我如何使用String.split(),以避免在result-array中出现空字符串?

prdp8dxp

prdp8dxp1#

没有这样一个内置的API可以忽略空分割,坦率地说,我看不出使用filter有什么问题。
如果您不喜欢filter不必要地在拆分上循环,可以使用splitToSequence,这会产生一个惰性序列。

str.splitToSequence("").filter(String::isNotEmpty).toList()

或者,只删除第一个和最后一个分割-这是唯一的将是空的。

str.split("").run { subList(1, lastIndex) }
// note that subList produces a "view" of the original list
// it does not create a copy

如果你真的只想使用split,你可以使用一个重载,它接受一个Regex,并使用一个正则表达式,它匹配字符串中除了开始和结束之外的所有零宽度位置。

// this matches any position where there is no start of string (^) before it, and no end of string ($) after it
str.split("(?<!^)(?!$)".toRegex())

这可能比其他方法慢得多,因为匹配正则表达式很复杂。

wvmv3b1j

wvmv3b1j2#

str.split("").filterNot { it.isBlank() }
7d7tgy0s

7d7tgy0s3#

你可以用空格分割字符串并连接字符串,然后你可以将结果字符串推入数组。它会工作得很好。

val str = "Testing 1234";
val segm = str.split(" ").join("")
        
println(segm);
println(segm.length)
sxpgvts3

sxpgvts34#

帧挑战:你正在做的是将字符串拆分成单个的 * 字符 * -并且有几个现有的方法可以对字符串执行此操作,例如:

  • asSequence()给出Sequence个字符。
  • asIterable()给出了Iterable个字符。 (你可以对一个Iterable做很多事情,就像对一个List一样。)
  • toCharArray()给出了一个CharArray。 (尽管在Kotlin中通常首选可迭代对象,因为它们更灵活,支持更好。)
  • forEach()在每个字符上执行给定的操作 。for (c in myString) { … } .)

使用其中的一个将比split ting更简单,而且可能更有效;它也会让任何人更容易阅读代码的意图。

相关问题