问题
如何以惯用的方式完成以下操作:将一个大的内容拆分String
为一个列表String
,每个列表不超过给定的大小,并避免将单词分成两半。
最接近的解决方案String.chunked()
(拆分单词)
最接近的解决方案是使用 String 类的chunked()
方法。然而,这样做的问题是它会分割给定的单词String
。
使用的代码示例String.chunked()
val longString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod " +
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, " +
"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo " +
"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse " +
"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " +
"proident, sunt in culpa qui officia deserunt mollit anim id est laborum. "
// Split [longString] into list
var listOfStrings = longString.chunked(40)
listOfStrings.forEach {
println(it)
}
Run Code Online (Sandbox Code Playgroud)
最接近示例的示例输出String.chunked()
以下是通过运行提供的示例代码收到的输出。可以看出,单词在行尾被分割。
Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna ali
qua. Ut enim ad minim veniam, quis nostr
ud exercitation ullamco laboris nisi ut
aliquip ex ea commodo consequat. Duis au
te irure dolor in reprehenderit in volup
tate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qu
i officia deserunt mollit anim id est la
borum.
Run Code Online (Sandbox Code Playgroud)
这并不是我发现的最惯用的方式,但也许它可以满足您的需求:
fun String.chunkedWords(limitChars: Int,
delimiter: Char = ' ',
joinCharacter: Char = '\n') =
splitToSequence(delimiter)
.reduce { cumulatedString, word ->
val exceedsSize = cumulatedString.length - cumulatedString.indexOfLast { it == joinCharacter } + "$delimiter$word".length > limitChars
cumulatedString + if (exceedsSize) {
joinCharacter
} else {
delimiter
} + word
}
Run Code Online (Sandbox Code Playgroud)
然后您可以按如下方式使用它:
longText.chunkedWords(40).run(::println)
Run Code Online (Sandbox Code Playgroud)
对于给定的字符串将打印:
Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim
id est laborum.
Run Code Online (Sandbox Code Playgroud)
您还可以将其拆分为从那里开始的行,例如longText.chunkedWords(40).splitAsSequence("\n")
. 请注意,如果字符串中已经存在换行符,它也会很好地分割,即如果您有一个String
like 的"Testing shorter lines.\nAnd now there comes a very long line"
调用.chunkedWords(17)
将产生以下输出:
Testing shorter
lines.
And now there // this tries to use the whole 17 characters again
comes a very
long line
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
935 次 |
最近记录: |