2017-12-12 10 views
-1

私はList<Object>に100個のオブジェクトを持っているとしましょう。どのような最善の方法をJava 8(任意のライブラリを使用せず)を含むList<List<Object>>を取得するには?リストのリストにリスト

+2

@birryreeあなたが応答する前にポストを読むことができ、それは、Java 8を意味するものではありません言及からといって、それがJava8 – Moussi

+0

@Moussiをmentionnedされました:非Java8特定の回答は適用されません。 – birryree

+0

@birryreeは古典的なJavaを使ってすべてを行うことができますが、ポスターはjava8ソリューションを探しています。 – Moussi

答えて

1

それはあなたがIntStreamとインデックスtakeWhileを使用して、これらの指標を使用してからサブリストを取る生成できるJava 9で

@Test 
public void givenList_whenParitioningIntoNSublists_thenCorrect() { 
    List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8); 
    List<List<Integer>> subSets = Lists.partition(intList, 3); 

    List<Integer> lastPartition = subSets.get(2); 
    List<Integer> expectedLastPartition = Lists.<Integer> newArrayList(7, 8); 
    assertThat(subSets.size(), equalTo(3)); 
    assertThat(lastPartition, equalTo(expectedLastPartition)); 
} 
2

外部finalカウンタが必要ですが、これは動作するようです。

// Must be final (or implicitly final). 
    AtomicInteger n = new AtomicInteger(); 
    Map<String, List<Integer>> groups = IntStream.range(0, 100) 
      .boxed() 
      .collect(Collectors.groupingBy(
        // Group by n/10. 
        o -> String.valueOf(n.getAndIncrement()/10) 
        ) 
      ); 
+0

PrimitiveIterator.OfIntを使用すると、AtomicIntegerを回避できます。 – richardstartin

+0

@richardstartin - ニース!ありがとう、私は 'PrimitiveIterator'を渡って来なかった。 – OldCurmudgeon

1

私が最初に(あなたのケースでは10個の要素、)チャックサイズを取り、その後、リストの上に行くと、そこからチャンクを取るためにsubListを使用すると思います。例えば:

List<List<Object>> subLists = IntStream 
    .range(0, (int) Math.ceil((double) list.size()/subListSize)) 
    .mapToObj(i -> new ArrayList<> 
         (list.subList(i * subListSize, (i + 1) * subListSize))) 
    .collect(Collectors.toList()); 

注: 鋳造doubleと天井にはsubListSizeが正確list.size()を分割しない場合には整数除算を回避するために、ダウンしています。

1

(あなたは私はとにかくこれを入れwithout any tierce libraryを投稿あなたにmentionned)グアバを使用して、より簡単です元のリスト。これは、ためのオブジェクトのいずれかの一覧を動作するはず :

private static final int BATCH_SIZE = 10; 

public void test(){ 
    List<List<Object>> batchedLists = split(generateTestObjects()); 
} 

public List<List<Object>> split(List<Object> objects) { 
    return IntStream.iterate(0, n -> n + BATCH_SIZE) 
      .takeWhile(n -> n < objects.size()) 
      .map(t -> objects.subList(t, Math.min(t + BATCH_SIZE, objects.size())) 
      .collect(Collectors.toList()); 
} 

public List<Object> generateTestObjects(){ 
    return IntStream.range(0, 100) 
      .boxed() 
      .collect(Collectors.toList()); 
} 
関連する問題