按最大大小并仅在Kotlin中使用空格的块字符串

按最大大小并仅在Kotlin中使用空格的块字符串,kotlin,split,Kotlin,Split,我正在尝试将一个字符串写入一个允许最大记录大小为固定大小(例如5)的文件。此外,它只允许在空白处分块(用作分隔符) 假设这是我的字符串: var myString = "ac de defgh a b c ghiz xy" 我想把它分成5块,用一个分线器连接起来,所以应该是这样的: ac de \n defgh \n a b c \n ghiz \n xy \n 我尝试这样做:myString.chunked(5).joinToString(separator=“\n”)

我正在尝试将一个
字符串
写入一个允许最大记录大小为固定大小(例如5)的文件。此外,它只允许在空白处分块(用作分隔符)

假设这是我的字符串:

var myString = "ac de defgh a b c ghiz xy"
我想把它分成5块,用一个分线器连接起来,所以应该是这样的:

ac de \n
defgh \n
a b c \n
ghiz \n
xy \n
我尝试这样做:
myString.chunked(5).joinToString(separator=“\n”)

但它不会在空白处块,而是在5个字符之后的任何位置


有没有其他方法可以实现我要做的事情?

一种方法是将字符串拆分为单词,使用诸如我给出的分块函数对单词进行分组,然后将单词重新连接成行,并将行重新连接成字符串:

myString.split(" ")
        .chunkedBy(5 + 1){ length + 1 }
        .joinToString("\n"){ it.joinToString(" ") }
这就给出了所需的结果(除了每行末尾的尾随空格和尾随换行符;如果你真的需要它们,它们很容易添加。)我希望你能看到它是如何工作的


这种方法效率不高;它创建了许多临时对象(用于单词、它们的列表、结果行以及最终字符串),但它的伸缩性可能相当好,并且相对清晰简洁。您几乎可以肯定地编写一个性能更好的函数,但它会更复杂,具体到这个特定的任务。

为了更好地解释,您能否扩展您的示例,以演示代码不起作用的情况?分块应该是贪婪的吗?例如,对于输入
“ab abcd”
,结果应该是什么?感谢您的评论。它不应该贪婪,因此“ab abcd”应该导致“ab\n abcd\n”。。。使用我的代码“ab abcd”将导致“ab ab\n cd\n”(添加空格以提高可读性),而这不是应该发生的(“abcd”不允许拆分为to行)谢谢!这就是我想要的-它似乎工作正常,而定制函数-正如你在帖子中提到的-有点毛茸茸的。我希望找到一个更简单的解决方案(使用内置的kotlin函数或类似的东西,代码行更少),但它应该可以做到这一点。再次感谢您提供的解决方案