gpt4 book ai didi

java - 如何根据字节减少 Java List 对象的大小

转载 作者:行者123 更新时间:2023-12-01 11:44:10 26 4
gpt4 key购买 nike

我有一个长字符串的 Java 列表,我正在使用 net.sourceforge.sizeof.SizeOf 尝试查找大小并将此列表 1 减 1,直到达到 List 对象的总大小是 <= 50000 字节。我下面的代码的性能很糟糕。

    import net.sourceforge.sizeof.SizeOf;

List<String> mySuperLongStrings; // this list contains thousands of long strings

Long size = SizeOf.deepSizeOf(mySuperLongStrings);

while (size > Long.valueOf(50000)) {
if (!mySuperLongStrings.isEmpty()) {
mySuperLongStrings.remove(0);
size = SizeOf.deepSizeOf(mySuperLongStrings);
}
}

关于如何做到这一点有什么建议吗?

最佳答案

因为 Size.deepSizeOf(list) 每次都必须迭代整个列表,因此您的算法具有二次运行时复杂度。如果您只是单独总结列表中字符串的大小,一旦超过 50000 字节的限制就停止,您可以轻松地将其更改为线性:

public static <T> List<T> sizedSubList(List<T> list, long maxSize) {
long totalSize = 0;
int i = list.size() - 1;
while (i >= 0) {
totalSize += SizeOf.deepSizeOf(list.get(i));
if (totalSize > maxSize) break;
i--;
}

return list.subList(i + 1, list.size());
}

(结果可能略大于 maxSize,因为此算法不考虑列表对象本身的大小(包括内部存储数组)。

用法:

List<String> smallList = sizedSubList(largeList, 50000);

请注意,此方法返回的子列表只是原始列表的 View ,因此对原始列表的后续修改将反射(reflect)在子列表中,反之亦然。

关于java - 如何根据字节减少 Java List 对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29289810/

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