如何在Java中将ArrayList从ArrayList中分割出来?

wqsoz72f  于 2023-04-04  发布在  Java
关注(0)|答案(5)|浏览(122)

如何在Java中获取ArrayList的数组切片?具体来说,我想这样做:

ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>

所以我希望这能起作用,但Java返回一个List-所以它是不兼容的。当我试图转换它时,Java不允许。我需要一个ArrayList-我该怎么办?

zf9nrax1

zf9nrax11#

在Java中,在API中使用接口类型而不是具体的类是一个很好的实践。
你的问题是,你1在应该使用List的地方使用了ArrayList(可能在很多地方)。结果,你给自己制造了一个不必要的问题,即列表是ArrayList
这是您的代码应该看起来像:

List input = new ArrayList(...);

public void doSomething(List input) {
   List inputA = input.subList(0, input.size()/2);
   ...
}

this.doSomething(input);

1 -根据你的评论,“你”实际上是其他人......在面试问题中设置了这个问题。这可能实际上是一个陷阱问题,旨在看看你如何科普创建一个与ArrayList兼容的ArrayList的(真实的)切片。
Your proposed solution的问题是/是这样的:

new ArrayList(input.subList(0, input.size()/2))

这是通过复制sublist调用返回的子列表(切片)来实现的。结果ArrayList不是正常意义上的切片。它是一个不同的列表。改变这个列表不会改变原始列表,反之亦然。此外,如果子列表很大,那么复制将是昂贵的。
如果你受到API的限制,比如你必须将inputA声明为ArrayList,你可以实现一个自定义的ArrayList子类,其中subList方法返回ArrayList的子类。但是:
1.这将是大量的工作,设计,实施和测试。
1.您现在已经向代码库中添加了重要的新类,可能依赖于ArrayList类的未记录方面(因此“可能会更改”)。
1.您需要更改代码库中创建ArrayList示例的相关位置,以创建子类的示例。
“复制数组”的解决方案更实用...请记住,这些不是真正的切片。

ergxz8rk

ergxz8rk2#

如果你知道需要从ArrayList中删除的元素的startIndex和endIndex,我找到了一种方法
al为原始ArrayList,startIndexendIndex分别为要从数组中删除的开始和结束索引:

al.subList(startIndex, endIndex + 1).clear();
ozxc1zmp

ozxc1zmp3#

如果没有现有的方法,那么我猜你可以从0迭代到input.size()/2,获取每个连续的元素并将其追加到一个新的ArrayList。

EDIT:其实我觉得你可以拿这个List,用one of the ArrayList constructors示例化一个新的ArrayList。

72qzrwbm

72qzrwbm4#

虽然这篇文章是非常古老的.如果有人在寻找这个..
Guava有助于将List划分为指定大小的子列表

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
    List<List<Integer>> subSets = Lists.partition(intList, 3);
ni65a41a

ni65a41a5#

我是这样解决的,我忘记了子列表是对原始列表中元素的直接引用,所以它不起作用是有道理的。

ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));

相关问题