【问题标题】:How can I split an ArrayList into several lists?如何将 ArrayList 拆分为多个列表?
【发布时间】:2009-12-15 20:39:48
【问题描述】:

参见下面的 ArrayList:

List<Integer> values = new ArrayList<Integer>();
values.add(0);
values.add(1);
values.add(2);
values.add(3);
values.add(4);
values.add(5);
values.add(6);

所以我们有:

integerList.size(); // outputs 7 elements

我需要如下显示Google chart

http://chart.apis.google.com/chart?chs=300x200&chd=t:60,-1,80,60,70,35&cht=bvg&chbh=20,4,20&chco=4C5F2B,BED730,323C19&chxt=y&chxr=0,0,500

要生成它的值,我只需调用

StringUtils.join(values, ","); // outputs 0,1,2,3,4,5,6

它发生 它支持高达 1000 像素宽度。因此,如果我有很多值,我需要将我的 ArrayList 拆分为其他 ArrayList 以生成其他图表。比如:

Integer targetSize = 3; // And suppose each target ArrayList has size equal to 3

// ANSWER GOES HERE
List<List<Integer>> output = SomeHelper.split(values, targetSize);

我应该使用什么 Helper 来实现我的目标?

【问题讨论】:

    标签: java list split helper


    【解决方案1】:

    google-collections 有 Lists.partition()。您为每个子列表提供大小。

    【讨论】:

    • 我认为人们喜欢重新发明轮子
    • 没有。问题是,在许多情况下,找到轮子比发明自己的轮子更难。
    • 顺便说一句,即使是链接的类也复制了功能。 Lists.asList(...) 重复 java.util.Arrays.asList()。如果 new 后面有一个空格,则有几个 newXXX 方法的功能完全相同,从而改为调用构造函数。
    • @jdmichal 找到轮子比发明自己的 (+1) 来发表评论更难
    • jdmichal:在这两种情况下都不是真的。 'List list = Lists.newArrayList()' 可以用来代替 'List list = new ArrayList()'。许多用户强烈希望避免冗余。 Lists.asList() 将一个元素和数组或两个元素和一个数组组合成一个列表。如果您阅读文档,您会发现事实如此,以及为什么如此。 Arrays.asList() 不这样做。是什么让您如此热衷于试图诋毁我们的图书馆是轮子的再发明?
    【解决方案2】:

    首先,您可能会发现List#subList() 很有用。这是一个基本示例:

    public static void main(String... args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(0);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
    
        int targetSize = 3;
        List<List<Integer>> lists = split(list, targetSize);
        System.out.println(lists); // [[0, 1, 2], [3, 4, 5], [6]]
    }
    
    public static <T extends Object> List<List<T>> split(List<T> list, int targetSize) {
        List<List<T>> lists = new ArrayList<List<T>>();
        for (int i = 0; i < list.size(); i += targetSize) {
            lists.add(list.subList(i, Math.min(i + targetSize, list.size())));
        }
        return lists;
    }
    

    请注意,我没有使用 splittedInto,因为它与 targetSize 结合使用没有多大意义。

    【讨论】:

    • Nitpick:可能应该向 ArrayList 构造函数提供 targetSize,以便它立即分配适当大小的数组,并且以后不会过度分配/调整大小。
    • 不,targetSize 不是lists 的长度。应该是我没有使用的splittedIntosubList 已经考虑到了这一点。
    • new ArrayList&lt;List&lt;T&gt;&gt;((list.size() / targetSize) + 1) 会更好。
    • 其实你是对的。拆分成没有意义。 (+1)
    • 哦,对了。我完全读错了那个代码。认为该列表是为子列表制作的。感谢您的更正。正如所指出的,仍然可以确定正确的大小。
    【解决方案3】:

    Apache Commons Collections 4ListUtils 类中有一个partition 方法。它是这样工作的:

    import org.apache.commons.collections4.ListUtils;
    ...
    
    int targetSize = 3;
    List<Integer> values = ...
    List<List<Integer>> output = ListUtils.partition(values, targetSize);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 2011-02-23
      • 1970-01-01
      • 2022-10-07
      • 2014-12-29
      • 1970-01-01
      • 2018-11-25
      • 2019-06-05
      相关资源
      最近更新 更多