使用java中的subList对数据进行分区

时间:2012-07-18 09:16:52

标签: java arraylist sublist data-partitioning

我有一个List实现的ArrayList,它有很多索引。我想请愿 它进入单独的ArrayList。我做了

      List<List<Integer>> list = new ArrayList<List<Integer>>(10000000);
      List<List<Integer>> sublist1 = list.subList(0,x)
      List<List<Integer>> sublist2 = list.subList(x,y)

依此类推。我不知道它是否是正确的分区方式。能否请您建议一种有效的分区方式?

[编辑]

我有一个类似这样的数组列表:

    [[1,2,3],[4,5,6],[8,9,10],[11,12,13],[44,88,1000], ......,[54,23,53]]

这个列表非常长。我想从上面的列表中得到一些小尺寸的子列表。每个列表都包含非重叠的内部列表:

sublist1:[[1,2,3][4,5,6] ...[.,.,.]]  sublist2:[[,,,][] .... [,,,,]]  sublistn:[[,,,][,,,]....[54,23,53]]

[编辑] 请不要混淆[]是空列表。我想显示列表中的列表数。

3 个答案:

答案 0 :(得分:1)

我认为你在这里稍微混淆了这些类型。

也许这就是你所追求的:

public static List<List<Integer>> getSubLists(List<Integer> ints, int k) {
    List<List<Integer>> result = new ArrayList<List<Integer>>();
    for (int i = 0; i < ints.size(); i += k)
        result.add(ints.subList(i, Math.min(i+k, ints.size())));
    return result;
}

使用示例:

List<Integer> ints = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);

List<List<Integer>> sublists = getSubLists(ints, 3);

// Prints [[10, 20, 30], [40, 50, 60], [70, 80, 90], [100]]
System.out.println(sublists);

答案 1 :(得分:1)

这是一个跟随你的例子的建议:

private static List<List<Integer>> getSubLists(List<List<Integer>> ints, int i) {
    List<List<Integer>> sublist =
            new ArrayList<List<Integer>>(Collections.nCopies(ints.size(),
                                         Collections.<Integer>emptyList()));
    sublist.set(i, ints.get(i));
    return sublist;
}

使用示例:

List<List<Integer>> ints = Arrays.asList(Arrays.asList(1,2,3),
                                         Arrays.asList(4,5,6),
                                         Arrays.asList(54,23,53));

List<List<Integer>> subList0 = getSubLists(ints, 0);
List<List<Integer>> subList1 = getSubLists(ints, 1);
List<List<Integer>> subList2 = getSubLists(ints, 2);

System.out.println("subList0: " + subList0);
System.out.println("subList1: " + subList1);
System.out.println("subList2: " + subList2);

<强>输出:

subList0: [[1, 2, 3], [], []]
subList1: [[], [4, 5, 6], []]
subList2: [[], [], [54, 23, 53]]

答案 2 :(得分:1)

我建议您详细查看java集合API来回答这个问题,因为它主要取决于访问类型和您在集合中访问的数据类型。

没有任何进一步的细节,至少有两个好的建议:

  1. 最佳解决方案是移动到TreeSet,因为这些是自然快速的数据结构,只需切割树的一部分即可拆分。一切都已经成为Java API的一部分,您将无需做太多工作。 这要求您的用例不允许重复值,并且在您的集合中包含可订购数据,但始终会为您提供登录操作

  2. 如果您遇到不可订购的数据并且您承认重复的价值,则必须使用列表。 ArrayList具有访问O(n)的高效实现,因为它由Array支持。然而,由于分配相邻存储器的长空间的复杂性,使其非常大会带来一些问题。 使用ArrayList或LinkedList之间有一个收支平衡,你应该根据你的要求找出它,包括随机访问的需要,创建列表后的插入/删除等等