代码之家  ›  专栏  ›  技术社区  ›  B T

如何在Java中从ARAYLIST中分割数组?

  •  62
  • B T  · 技术社区  · 15 年前

    如何获取 ArrayList 在Java中?具体来说,我想这样做:

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

    所以我希望这能起作用,但是Java返回了 List -所以这是不相容的。当我试着把它扔掉的时候,Java不会让我这么做。我需要一个 数组列表 -我能做什么?

    5 回复  |  直到 6 年前
        1
  •  99
  •   Stephen C    8 年前

    在Java中,在API中使用接口类型而不是具体类是一种很好的实践。

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

    这就是代码的外观:

    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))
    

    通过复制子列表来工作。这不是正常意义上的一块。此外,如果子列表很大,那么复制将非常昂贵。


    如果您受到 无法更改 ,所以你 不得不 声明 inputA 作为一个 数组列表 ,您可能能够实现 数组列表 其中 subList 方法返回 数组列表 . 然而:

    1. 设计、实现和测试将是一项艰巨的工作。
    2. 现在您已经向代码库添加了重要的新类,可能依赖于 数组列表 班级。
    3. 您需要更改代码库中您正在创建的相关位置 数组列表 实例来创建子类的实例。

    “复制阵列”解决方案更实用…记住这些不是真的切片。

        2
  •  6
  •   Hiren Shah    6 年前

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

    编辑 :实际上,我认为您可以使用该列表来实例化一个新的arraylist one of the ArrayList constructors .

        3
  •  4
  •   Aman Gupta    9 年前

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

    al 成为最初的阵列列表 startIndex , endIndex 分别是要从数组中移除的开始索引和结束索引:

    al.subList(startIndex, endIndex + 1).clear();
    
        4
  •  0
  •   Hari Rao    6 年前

    虽然这个职位很老。万一有人在找这个…

    番石榴有助于将列表划分为指定大小的子列表

    List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
        List<List<Integer>> subSets = Lists.partition(intList, 3);
    
        5
  •  -5
  •   B T    13 年前

    我就是这样解决的。我忘记了子列表是对原始列表中元素的直接引用,所以它不起作用是有道理的。

    arrayList inputa=新的arrayList(input.sublist(0,input.size()/2));