2015-06-23 5 views
8

Ist es möglich, eine Liste in reinem Jdk8 in gleiche Teile (Unterlisten) zu partitionieren.Java 8 Partitionsliste

Ich weiß, es ist möglich mit Guava Lists Klasse, aber können wir es mit reinem Jdk tun? Ich möchte meinem Projekt keine neuen Jars hinzufügen, nur für einen Anwendungsfall.

SOLUTONS:

Die beste Lösung bis jetzt von tagir-valeev vorgestellt wurde:

Ich habe auch three other possibilities, aber sie sind nur wenige Fälle ment:

1.Collectors.partitioningBy() um die Liste in 2 Unterlisten zu teilen - wie folgt:

2.Collectors.groupingBy() unserer Liste auf mehrere Partitionen aufgeteilt:

Map<Integer, List<Integer>> groups = 
     intList.stream().collect(Collectors.groupingBy(s -> (s - 1)/3)); 
    List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values()); 

3.Split durch Trennzeichen:

List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8); 

    int[] indexes = 
     Stream.of(IntStream.of(-1), IntStream.range(0, intList.size()) 
     .filter(i -> intList.get(i) == 0), IntStream.of(intList.size())) 
     .flatMapToInt(s -> s).toArray(); 
    List<List<Integer>> subSets = 
     IntStream.range(0, indexes.length - 1) 
       .mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1])) 
       .collect(Collectors.toList()); 
+0

Sie können sich Guava Quellcode anschauen und es entsprechend machen ...? –

+0

Wring eine Funktion in Plain-Java ist kein Problem, aber JDK8 haben einige tolle Funktionen mit Streaming-und Operationen auf Sammlungen, und ich nehme an, es wäre schneller als das Schreiben von eigenem Code. Aber das ist nur meine Annahme. – Beri

+0

Ich markierte es als mögliches Duplikat, da Java-8-Lösung auch dort verfügbar ist. –

Antwort

11

, die leicht mit dem subList() Verfahren durchgeführt werden kann:

List<String> collection = new ArrayList(21); 
// fill collection 
int chunkSize = 10; 
List<List<String>> lists = new ArrayList<>(); 
for (int i=0; i<collection.size(); i+= chunkSize) { 
    int end = Math.min(collection.size(), i + chunkSize); 
    lists.add(collection.subList(i, end)); 
}