如何在Java中将ArrayList从ArrayList中切片出来?

2022-08-31 11:03:09

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

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

所以我期望这能工作,但Java返回一个 - 所以它不兼容。当我尝试投掷它时,Java不会让我这样做。我需要一个 - 我该怎么办?ListArrayList


答案 1

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

你的问题是你1正在使用(可能在很多地方)你应该真正使用的地方。因此,您为自己制造了问题,并提出了不必要的约束,即列表是.ArrayListListArrayList

这是你的代码应该是什么样子的:

List input = new ArrayList(...);

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

this.doSomething(input);

1 - 根据您的评论,“您”实际上是其他人...谁在面试问题中设置了这个问题。这实际上可能是一个棘手的问题,旨在了解您将如何应对创建与ArrayList兼容的赋值的ArrayList的(真实)切片。


您提出的问题的“解决方案”是这样的:

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

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


如果您受到无法更改的 API 的约束,因此必须声明为 ,则可以实现一个自定义子类,其中该方法返回 的子类。然而:inputAArrayListArrayListsubListArrayList

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

“拷贝阵列”解决方案更实用...请记住,这些不是真正的切片。


答案 2

我已经找到了一种方法,如果你知道开始索引和结束索引的元素需要从ArrayList中删除

设为原始 ArrayList 和 ,分别是要从数组中删除的开始和结束索引:alstartIndexendIndex

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

推荐