2

多数のインデックスを持つ 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]]

[][編集] null リストと混同しないでください。リスト内のリストの数を表示したかったのです。

4

3 に答える 3

1

この質問に答えるには、主にアクセスの種類とコレクション内でアクセスしているデータの種類に依存するため、Java コレクション API を詳細に確認することをお勧めします。

これ以上の詳細はありませんが、少なくとも 2 つの良い提案があります。

  1. 最適な解決策は、TreeSet に移動することです。これは、Tree の一部を切り取るだけで分割できる自然に高速なデータ構造であるためです。すべてがすでに Java API の一部であるため、多くの作業は必要ありません。これには、値の繰り返しを許可しないユースケースと、コレクション内に順序付け可能なデータを含める必要がありますが、常にログ操作を提供します

  2. 順序付けできないデータに行き詰まっていて、値が繰り返されることを認める場合は、リストを使用する必要があります。ArrayList は、配列によってサポートされているため、O(n) にアクセスできる効率的な実装を備えています。ただし、非常に大きくすると、隣接するメモリの長いスペースを割り当てる複雑さが原因で、いくつかの問題が生じます。ArrayList または LinkedList の使用には損益分岐点があります。これは、ランダム アクセスの必要性、リスト作成後の挿入/削除など、要件に応じて見つける必要があります。

于 2012-07-18T09:43:17.437 に答える
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 に答える