0

假设我有一个像 {1,2,3,4,5,6,7,8} 这样的列表。有没有一种快速的方法来创建两个列表(一个带有前半部分,另一个带有后半部分)?拆分的位置总是列表大小的一半(列表总是偶数)

目前我的方法是将大小除以 2,然后迭代列表,在 list1 中添加低于该值的任何内容,在 list2 中添加任何高于该值的任何内容。我只是想知道是否有更快的方法(我需要做超过 10 亿个这样的操作,所以即使性能稍有改进也可以为我节省很多时间)。

4

2 回答 2

4

至于内置功能,您可以使用List#subList(int, int)

int size = original.size();
List<Integer> first = original.subList(0, size / 2);
List<Integer> second = original.subList(size / 2, size);

是否要使用subList()取决于您对内容所做的操作。subList()将视图返回到原始列表中(而不是实际复制)。确保您阅读了 javadoc。这是一个片段:

返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。(如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。

另外,我无法真正谈论它的性能subList()以及它可能会或可能不会满足您的要求。我想因为它只是创建视图而不是复制它会相对较快。但同样,相当情境化,您需要以任何一种方式对其进行分析才能知道。

于 2012-04-29T22:39:53.553 回答
0

好吧,你必须做超过十亿个这些 - 有趣。

您应该分析不同的方法。

我的赌注是使用数组和System.arraycopy

如果您的代码不是生成列表的代码,则取决于List所提供的您的实现。

如果我们提供有关要求的更多详细信息,您会得到更好的答案。是必需的副本还是视图(由subList()enought 提供)。您正在使用/正在提供哪种实现List等。速度也将受到 jvm(版本和平台)的影响。

于 2012-04-29T22:42:17.237 回答