如何从Java中的ArrayList中分割ArrayList?

如何从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 所以我认为

如何在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

所以我认为这是可行的,但是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列表文档的快速链接: