如何从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的子类。 然而:

  1. devise,实施和testing将是很多工作。
  2. 现在,您已经向您的代码库添加了重要的新类,可能依赖于ArrayList类的未logging方面(因此“可能更改”)方面。
  3. 您需要更改您的代码库中的相关位置,以创buildArrayList实例来创build子类的实例。

“复制arrays”解决scheme更实际…铭记这些不是真正的切片。

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

编辑 :其实,我认为你可以采取该列表,并使用它来实例化一个新的ArrayList使用ArrayList构造函数之一 。

如果您知道需要从ArrayList中移除的元素的startIndex和endIndex,我已经find了一种方法

al为原始的ArrayList和startIndexendIndex分别是从数组中删除的开始和结束索引:

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

这就是我解决它的方法。 我忘记了这个子列表是直接引用了原始列表中的元素,所以它为什么不起作用是有道理的。

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