如何从Java中的ArrayList中分割ArrayList?
如何在Java中获取如何从Java中的ArrayList中分割ArrayList?,java,arraylist,Java,Arraylist,如何在Java中获取ArrayList的数组切片?具体来说,我想做如下工作: ArrayList<Integer> inputA = input.subList(0, input.size()/2); // where 'input' is a prepouplated ArrayList<Integer> ArrayList inputA=input.subList(0,input.size()/2); //其中“input”是预上传的ArrayList 所以我认为
ArrayList
的数组切片?具体来说,我想做如下工作:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
ArrayList inputA=input.subList(0,input.size()/2);
//其中“input”是预上传的ArrayList
所以我认为这是可行的,但是Java返回一个
列表
——所以它是不兼容的。当我尝试使用它时,Java不会让我这么做。我需要一个ArrayList
-我能做什么?如果没有现有的方法,那么我想您可以从0迭代到input.size()/2
,获取每个连续的元素并将其附加到新的ArrayList
编辑:实际上,我认为您可以获取该列表,并使用它来实例化一个新的ArrayList。这就是我如何解决它的。我忘记了子列表是对原始列表中元素的直接引用,所以它不起作用是有道理的
ArrayList<Integer> inputA = new ArrayList<Integer>(input.subList(0, input.size()/2));
ArrayList inputA=new ArrayList(input.subList(0,input.size()/2));
在Java中,在API中使用接口类型而不是具体类是一种很好的做法
您的问题是您1正在使用ArrayList
(可能在很多地方)而您实际上应该使用List
。因此,您为自己造成了一些问题,其中有一个不必要的约束,即列表是ArrayList
您的代码应该是这样的:
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的限制,因此必须将
inputA
声明为ArrayList
,那么您可能能够实现ArrayList
的自定义子类,其中subList
方法返回ArrayList
的子类。然而:
ArrayList
类的未记录方面(因此“可能会更改”)ArrayList
实例的相关位置,以创建子类的实例“复制阵列”解决方案更实用。。。请记住,这些不是真正的切片。如果您知道需要从ArrayList中删除的元素的startIndex和endIndex,我找到了一种方法 将
al
设为原始数组列表,startIndex
,endIndex
分别设为要从数组中删除的开始索引和结束索引:
al.subList(startIndex, endIndex + 1).clear();
虽然这个职位很老。万一有人在找这个 Guava有助于将列表划分为指定大小的子列表
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subSets = Lists.partition(intList, 3);
List intList=Lists.newArrayList(1,2,3,4,5,6,7,8);
列表子集=Lists.partition(intList,3);
这正是我所做的(在阅读您的编辑之前发布了我的答案)。谢谢:)但这会复制列表以创建新的ArrayList。@BT-请注意,这不是术语“切片”在本上下文中的通常含义。您为什么坚持使用ArrayList
?我认为您可能对接口的工作方式缺乏一点了解,因为List
和ArrayList
不是“不兼容的”-ArrayList
实现了List
,而且List
可能包含了您需要的所有必要方法。我坚持使用ArrayList,因为这是一个带有严格方法原型的inteview问题。我显然缺乏理解,因为子列表应该返回列表类型,但我不能将返回的列表强制转换为ArrayList。所以你告诉我,伙计,他完全有可能需要一个ArrayList
,因为他需要用它调用一个接受ArrayList
的方法。可以说,这种方法设计得很糟糕,应该接受列表
,但这种情况不仅会出现在面试问题中,也会出现在别人编写的代码中,而这些代码是不能随意更改的。同事和图书馆并不总是十全十美的;它返回到原始列表的视图(),实际上@Matthew,我指的是OP的自我回答,他在这里这样做:newArrayList(input.subList(0,input.size()/2))
+1对于这个短语:在Java中,在API中使用接口类型而不是具体的类是很好的做法。到Guava列表文档的快速链接: