如何从Java中的ArrayList切片ArrayList?
如何获得Java中ArrayList
的数组切片? 具体而言,我想要做这样的事情:
ArrayList<Integer> inputA = input.subList(0, input.size()/2); // where 'input' is a prepouplated ArrayList<Integer>
所以我期望这个工作,但Java返回一个List
– 所以它是不兼容的。 而当我尝试抛出它,Java不会让我。 我需要一个ArrayList
– 我该怎么办?
在Java中,在API中使用接口types而不是具体类是一种好的做法。
你的问题是,你正在使用ArrayList
(可能在很多地方),你真的应该使用List
。 因此,您为自己创build了一个问题,列表是一个ArrayList
。
这就是你的代码应该是这样的:
List input = new ArrayList(...); public void doSomething(List input) { List inputA = input.subList(0, input.size()/2); ... } this.doSomething(input);
你提出的“解决scheme”是这样的:
new ArrayList(input.subList(0, input.size()/2))
这是通过制作副本列表的作品。 这不是一般意义上的切片。 此外,如果子列表很大,那么复制将是昂贵的。
如果受限于不能更改的API,例如必须将 inputA
声明为ArrayList
,则可以实现ArrayList
的自定义子类,其中subList
方法返回ArrayList
的子类。 然而:
- devise,实施和testing将是很多工作。
- 现在,您已经向您的代码库添加了重要的新类,可能依赖于
ArrayList
类的未logging方面(因此“可能更改”)方面。 - 您需要更改您的代码库中的相关位置,以创build
ArrayList
实例来创build子类的实例。
“复制arrays”解决scheme更实际…铭记这些不是真正的切片。
如果没有现有的方法,那么我猜你可以迭代0到input.size()/2
,每个连续的元素并将其附加到一个新的ArrayList。
编辑 :其实,我认为你可以采取该列表,并使用它来实例化一个新的ArrayList使用ArrayList构造函数之一 。
如果您知道需要从ArrayList中移除的元素的startIndex和endIndex,我已经find了一种方法
设al
为原始的ArrayList和startIndex
, endIndex
分别是从数组中删除的开始和结束索引:
al.subList(startIndex, endIndex + 1).clear();
这就是我解决它的方法。 我忘记了这个子列表是直接引用了原始列表中的元素,所以它为什么不起作用是有道理的。
ArrayList inputA = new ArrayList(input.subList(0,input.size()/ 2));