gpt4 book ai didi

Kotlin - 如何根据字符的总长度拆分字符串列表

转载 作者:行者123 更新时间:2023-12-02 12:37:15 24 4
gpt4 key购买 nike

我正在用 Kotlin 编写一个程序,该程序将消息发布到休息端点。

val messages : List<String> = getMessageToSend();
webClient
.post()
.uri { builder -> builder.path("/message").build() }
.bodyValue(PostMessageRequest(
messages.joinToString("\n")
))
.exchange()
.block()
但是,其余端点对发送的最大消息大小有限制。我对 Kotlin 还很陌生,但我一直在寻找一种功能性的方法来实现这一目标,但我正在努力。我知道我会如何用 Java 写这个,但我很想把它做对。我要拆分 messages list 到一个列表列表中,每个列表限制为允许的最大大小,并且只添加整个字符串,然后单独发布它们。我看过类似 chunked 的方法,但这似乎不够灵活,无法实现我想要做的事情。
例如,如果我的消息是 [this, is, an, example]并且限制是 10,我希望我的列表列表是 [[this, is an], [example]]任何建议将不胜感激。

最佳答案

这看起来很像我以前遇到过的情况。为了解决这个问题,我编写了以下通用扩展函数:

/**
* Splits a collection into sublists not exceeding the given size. This is a
* generalisation of [List.chunked]; but where that limits the _number_ of items in
* each sublist, this limits their total size, according to a given sizing function.
*
* @param maxSize None of the returned lists will have a total size greater than this
* (unless a single item does).
* @param size Function giving the size of an item.
*/
inline fun <T> Iterable<T>.chunkedBy(maxSize: Int, size: T.() -> Int): List<List<T>> {
val result = mutableListOf<List<T>>()
var sublist = mutableListOf<T>()
var sublistSize = 0L
for (item in this) {
val itemSize = item.size()
if (sublistSize + itemSize > maxSize && sublist.isNotEmpty()) {
result += sublist
sublist = mutableListOf()
sublistSize = 0
}
sublist.add(item)
sublistSize += itemSize
}
if (sublist.isNotEmpty())
result += sublist

return result
}
实现有点麻烦,但使用起来非常简单。在你的情况下,我希望你会做这样的事情:
messages.chunkedBy(1024){ length + 1 }
.map{ it.joinToString("\n") }
给出一个字符串列表,每个字符串不超过 1024 个字符*。 ( + 1 当然是允许换行符的。)
老实说,我很惊讶像这样的东西不在标准库中。
(* 除非任何初始字符串更长。)

关于Kotlin - 如何根据字符的总长度拆分字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63633977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com