【问题标题】:Paritioning data using subList in java在java中使用subList对数据进行分区
【发布时间】:2012-07-18 09:16:51
【问题描述】:

我有一个具有大量索引的 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]]

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

【问题讨论】:

  • 为什么有一个 List-of-Lists 来存储一些索引?
  • 其实里面的list里面有完整的信息。这就是为什么我将它列在列表中。
  • 你的分区方式是正确的。在您的former question 中,您提供了有关您为什么这样做的更多详细信息,所以如果这个问题我看不到重点。
  • 在你的例子中sublist2不应该是[[][4,5,6] ... []]吗?
  • 所以扁平化列表并使用我给出的第一个答案?

标签: java arraylist sublist data-partitioning


【解决方案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);

【讨论】:

  • 感谢您的回复。但是,这不正是我所期待的。我会尽量通过编辑问题让你清楚
【解决方案2】:

以下是根据您的示例提出的建议:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2023-03-17
      • 1970-01-01
      • 2020-06-19
      • 2022-07-29
      • 2015-02-04
      • 1970-01-01
      相关资源
      最近更新 更多