在java中有没有一种本机的或更快的方法来划分列表?

在java中有没有一种本机的或更快的方法来划分列表?,java,partitioning,Java,Partitioning,假设我有一个这样的列表{1,2,3,4,5,6,7,8}。有没有快速创建两个列表的方法(一个是前半部分,另一个是后半部分)?拆分位置总是列表大小的一半(列表总是偶数) 目前我的方法是将大小除以2,然后迭代列表,在列表1中添加低于值的内容,在列表2中添加高于值的内容。我只是想知道是否有更快的方法(我需要做超过10亿个这样的事情,所以即使性能稍有改善也可以节省我很多时间)。至于内置功能,您可以使用: int size=original.size(); 列表第一=原始。子列表(0,大小/2); 第二个

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


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

至于内置功能,您可以使用:

int size=original.size();
列表第一=原始。子列表(0,大小/2);
第二个列表=原始。子列表(大小/2,大小);
是否要使用
subList()
取决于您对内容所做的操作<代码>子列表()将视图返回到原始列表中(而不是实际复制)。确保您阅读了javadoc。下面是一个片段:

返回此列表中指定区域之间部分的视图 从索引(包含)到索引(独占)。(如果来自索引和 toIndex相等时,返回的列表为空。)返回的列表为 受此列表支持,因此在返回的列表中进行非结构性更改 都反映在该列表中,反之亦然。返回的列表支持 此列表支持的所有可选列表操作


另外,我不能真正谈论
subList()
的性能以及它如何满足您的需求。我可以想象,因为它只是创建视图,而不是复制,所以速度会相对较快。但同样,情况非常复杂,您需要以任何一种方式对其进行分析。

就内置功能而言,您可以使用:

int size=original.size();
列表第一=原始。子列表(0,大小/2);
第二个列表=原始。子列表(大小/2,大小);
是否要使用
subList()
取决于您对内容所做的操作<代码>子列表()将视图返回到原始列表中(而不是实际复制)。确保您阅读了javadoc。下面是一个片段:

返回此列表中指定区域之间部分的视图 从索引(包含)到索引(独占)。(如果来自索引和 toIndex相等时,返回的列表为空。)返回的列表为 受此列表支持,因此在返回的列表中进行非结构性更改 都反映在该列表中,反之亦然。返回的列表支持 此列表支持的所有可选列表操作


另外,我不能真正谈论
subList()
的性能以及它如何满足您的需求。我可以想象,因为它只是创建视图,而不是复制,所以速度会相对较快。不过,还是很有情境性的,你需要以任何一种方式来描述它。

好的,你必须做超过十亿次的娱乐

您应该分析不同的方法

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

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

如果您希望我们提供更多关于需求的详细信息,您会得到更好的答案。是否需要副本或是视图(由
subList()
enought提供)。您正在使用/正在提供的
列表的哪个实现。

速度也将受到jvm(版本和平台)的影响。

好的,你必须做超过十亿次的游戏

您应该分析不同的方法

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

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

如果您希望我们提供更多关于需求的详细信息,您会得到更好的答案。是否需要副本或是视图(由
subList()
enought提供)。您正在使用/正在提供的
列表的哪个实现。

速度也会受到jvm(版本和平台)的影响。

没有更快的方法(要复制数组,必须复制每个元素),但至少可以自动执行:没有更快的方法(要复制数组,必须复制每个元素),但至少可以自动执行:不是100%,但第二个不应该是
子列表(2号,1号)
。第二个参数是排他性的,因此我认为
size
是正确的。不过,我还没有测试过。您可能想提到,此方法不会创建列表的副本,因此对基础列表的任何结构更改都会使
子列表的结果无效。我测试了此参数,它工作得非常完美。现在开始分析!谢谢太多了(我不知道子列表存在,我搜索了拆分/分区等)。@Lostsoul不必担心分析它-这是最快的,假设您不介意原始集合中的更改在子列表中可见,并且结构更改使结果无效。不是100%,但第二个不应该是
子列表(2号,1号)
。第二个参数是排他性的,因此我认为
size
是正确的。不过,我还没有测试过。您可能想提到,此方法不会创建列表的副本,因此对基础列表的任何结构更改都会使
子列表的结果无效。我测试了此参数,它工作得非常完美。现在开始分析!谢谢这么多(我不知道子列表存在,我搜索了拆分/分区等)。@Lostsoul不必担心分析它-这是最快的,假设您不介意原始集合中的更改在子列表中可见,并且结构更改使结果无效。
int size = original.size();
List<Integer> first = original.subList(0, size / 2);
List<Integer> second = original.subList(size / 2, size);