2

我有一个 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)

等等。我不知道这是否是正确的分区方式。你能建议我一种有效的分区方法吗?

[编辑]

我有一个这样的arrayList:

    [[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]]

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

4

3 回答 3

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);
于 2012-07-18T09:23:17.267 回答
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]]
于 2012-07-18T09:41:16.697 回答
1

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

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

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

  2. 如果您遇到不可排序的数据并且您承认重复值,您将不得不使用列表。ArrayList 具有访问 O(n) 的高效实现,因为它由 Array 支持。然而,由于分配相邻内存的长空间的复杂性,使其非常大会带来一些问题。使用 ArrayList 和 LinkedList 有一个收支平衡,需要根据自己的需求找出来,包括是否需要随机访问、创建列表后的插入/删除等等

于 2012-07-18T09:43:17.437 回答