如何ArrayList
在Java中获取的数组切片?具体来说,我想做这样的事情:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
因此,我希望这能够正常工作,但是Java返回List
-,因此不兼容。而且当我尝试投射它时,Java不会让我这么做。我需要ArrayList
-该怎么办?
如何ArrayList
在Java中获取的数组切片?具体来说,我想做这样的事情:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
因此,我希望这能够正常工作,但是Java返回List
-,因此不兼容。而且当我尝试投射它时,Java不会让我这么做。我需要ArrayList
-该怎么办?
ArrayList
因为他随后需要使用接受一个的方法来调用该方法ArrayList
。可以说,这种方法的设计很差,应该接受List
,但是这种情况不仅会出现在面试问题中,还会出现在其他人编写的代码中,人们不能随便改变。同事和图书馆并不总是完美的。
Answers:
在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);
您为问题建议的“解决方案”是/是:
new ArrayList(input.subList(0, input.size()/2))
可以通过复制子列表来实现。这不是正常意义上的切面。此外,如果子列表很大,那么制作副本将很昂贵。
如果您受到无法更改的API的约束,因此必须将其声明inputA
为an ArrayList
,则可以实现的自定义子类,ArrayList
其中该subList
方法将返回的子类ArrayList
。然而:
ArrayList
。ArrayList
实例的地方更改相关位置,以创建子类的实例。“复制数组”解决方案更为实用……请记住,这些不是真实的切片。
new ArrayList(input.subList(0, input.size()/2))
我找到了一种方法,如果您知道需要从ArrayList中删除的元素的startIndex和endIndex
让al
是原始ArrayList和startIndex
,endIndex
是开始和结束索引被分别从阵列中移除:
al.subList(startIndex, endIndex + 1).clear();
如果没有现有的方法,那么我想您可以从0迭代到input.size()/2
,获取每个连续的元素并将其附加到新的ArrayList上。
编辑:实际上,我认为您可以使用该List并使用ArrayList构造函数之一实例化新的ArrayList。
虽然这个帖子很老。如果有人在找这个。
番石榴有助于将列表划分为指定大小的子列表
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subSets = Lists.partition(intList, 3);
ArrayList
?我认为您可能缺少一点了解接口如何工作的原因List
,因为ArrayList
它们不是“不兼容”的—ArrayList
实现List
,并且List
可能包含您需要的所有必要方法。