如何在Java中获取ArrayList的数组切片?具体来说,我想这样做:
ArrayList
ArrayList<Integer> inputA = input.subList(0, input.size()/2); // where 'input' is a prepouplated ArrayList<Integer>
所以我希望这能起作用,但Java返回一个List-所以它是不兼容的。当我试图转换它时,Java不允许。我需要一个ArrayList-我该怎么办?
List
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示例的相关位置,以创建子类的示例。“复制数组”的解决方案更实用...请记住,这些不是真正的切片。
sublist
inputA
subList
ergxz8rk2#
如果你知道需要从ArrayList中删除的元素的startIndex和endIndex,我找到了一种方法设al为原始ArrayList,startIndex,endIndex分别为要从数组中删除的开始和结束索引:
al
startIndex
endIndex
al.subList(startIndex, endIndex + 1).clear();
ozxc1zmp3#
如果没有现有的方法,那么我猜你可以从0迭代到input.size()/2,获取每个连续的元素并将其追加到一个新的ArrayList。
input.size()/2
EDIT:其实我觉得你可以拿这个List,用one of the ArrayList constructors示例化一个新的ArrayList。
72qzrwbm4#
虽然这篇文章是非常古老的.如果有人在寻找这个..Guava有助于将List划分为指定大小的子列表
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); List<List<Integer>> subSets = Lists.partition(intList, 3);
ni65a41a5#
我是这样解决的,我忘记了子列表是对原始列表中元素的直接引用,所以它不起作用是有道理的。
ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
5条答案
按热度按时间zf9nrax11#
在Java中,在API中使用接口类型而不是具体的类是一个很好的实践。
你的问题是,你1在应该使用
List
的地方使用了ArrayList
(可能在很多地方)。结果,你给自己制造了一个不必要的问题,即列表是ArrayList
。这是您的代码应该看起来像:
1 -根据你的评论,“你”实际上是其他人......在面试问题中设置了这个问题。这可能实际上是一个陷阱问题,旨在看看你如何科普创建一个与
ArrayList
兼容的ArrayList
的(真实的)切片。Your proposed solution的问题是/是这样的:
这是通过复制
sublist
调用返回的子列表(切片)来实现的。结果ArrayList
不是正常意义上的切片。它是一个不同的列表。改变这个列表不会改变原始列表,反之亦然。此外,如果子列表很大,那么复制将是昂贵的。如果你受到API的限制,比如你必须将
inputA
声明为ArrayList
,你可以实现一个自定义的ArrayList
子类,其中subList
方法返回ArrayList
的子类。但是:1.这将是大量的工作,设计,实施和测试。
1.您现在已经向代码库中添加了重要的新类,可能依赖于
ArrayList
类的未记录方面(因此“可能会更改”)。1.您需要更改代码库中创建
ArrayList
示例的相关位置,以创建子类的示例。“复制数组”的解决方案更实用...请记住,这些不是真正的切片。
ergxz8rk2#
如果你知道需要从ArrayList中删除的元素的startIndex和endIndex,我找到了一种方法
设
al
为原始ArrayList,startIndex
,endIndex
分别为要从数组中删除的开始和结束索引:ozxc1zmp3#
如果没有现有的方法,那么我猜你可以从0迭代到
input.size()/2
,获取每个连续的元素并将其追加到一个新的ArrayList。EDIT:其实我觉得你可以拿这个List,用one of the ArrayList constructors示例化一个新的ArrayList。
72qzrwbm4#
虽然这篇文章是非常古老的.如果有人在寻找这个..
Guava有助于将List划分为指定大小的子列表
ni65a41a5#
我是这样解决的,我忘记了子列表是对原始列表中元素的直接引用,所以它不起作用是有道理的。