如何从Java中的ArrayList中切出ArrayList?

B T*_*B T 70 java arraylist

如何获取ArrayListJava中的数组切片?具体来说,我想做这样的事情:

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

所以我希望这可以工作,但Java返回List- 所以它是不兼容的.当我试图施展它时,Java不会让我.我需要ArrayList- 我该怎么办?

Ste*_*n C 112

在Java中,最好使用接口类型而不是API中的具体类.

你的问题是你正在使用ArrayList(可能在很多地方)你真正应用的地方List.因此,您使用列表所属的不必要约束为自己创建了问题ArrayList.

这是你的代码应该是这样的:

List input = new ArrayList(...);

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

this.doSomething(input);
Run Code Online (Sandbox Code Playgroud)

你提出的解决问题的"解决方案"是:

new ArrayList(input.subList(0, input.size()/2))
Run Code Online (Sandbox Code Playgroud)

这可以通过制作子列表的副本来实现.它不是正常意义上的切片.此外,如果子列表很大,那么制作副本将是昂贵的.


如果您受到无法更改的API的约束,那么您必须声明inputAArrayList,您可能能够实现ArrayListsubList方法返回其子类的自定义子类ArrayList.然而:

  1. 设计,实施和测试需要做很多工作.
  2. 您现在已经为您的代码库添加了重要的新类,可能依赖于类的未记录方面(因此"可能会发生变化")方面ArrayList.
  3. 您需要更改代码库中创建ArrayList实例的相关位置,以创建子类的实例.

"复制阵列"解决方案更实用......请记住,这些不是真正的切片.

  • 实际上,subList不会复制; 它将视图返回到原始列表(http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList%28int,%20int%29) (5认同)
  • 实际上@Matthew,我指的是OP的自我答案:`new ArrayList(input.subList(0,input.size()/ 2))` (3认同)
  • 对于这句话+1:在 Java 中,最好在 API 中使用接口类型而不是具体类。 (2认同)

Jor*_*eña 6

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

编辑:实际上,我认为您可以使用该List并使用它来使用ArrayList构造函数之一实例化一个新的ArrayList.

  • 这正是我所做的(在我阅读你的编辑之前发布了我的答案).谢谢 : ) (2认同)
  • @BT - 对于记录,这不是术语"切片"在这种情况下通常意味着什么. (2认同)

Ama*_*pta 5

我找到了一种方法,如果您知道需要从ArrayList中删除的元素的startIndex和endIndex,

al是原始ArrayList和startIndexendIndex是开始和结束索引被分别从阵列中移除:

al.subList(startIndex, endIndex + 1).clear();
Run Code Online (Sandbox Code Playgroud)