Ich versuche, eine ArrayList mit N-Tiefe zu glätten. Dazu habe ich versucht, die flapMap-Methode der Stream-API zu verwenden. Ich kann es bekommen. Aber ich muss die Methode flatMap () wiederholt gemäß der Anzahl der Listen verwenden. Wenn ich eine weitere flatMap () -Methode verwende, wird ein Kompilierzeitfehler angezeigt. Gibt es eine Möglichkeit, dies dynamisch zu erledigen?
Dies ist der Code, den ich verwendet habe:
List<Integer> list1 = Arrays.asList(4,5,6);
List<Integer> list2 = Arrays.asList(7,8,9);
List<List<Integer>> listOfLists = Arrays.asList(list1, list2);
List<List<List<Integer>>> listA = Arrays.asList(listOfLists);
List<List<List<List<Integer>>>> listB = Arrays.asList(listA);
List<Integer> listFinal = listB.stream()
.flatMap(x -> x.stream())
.flatMap(x -> x.stream())
.flatMap(x -> x.stream())
.collect(Collectors.toList());
//In the above line, If I use listA instead of listB, it is showing error.
listFinal.forEach(x-> System.out.println(x));
Lösung des Problems
Dies scheint für mich zu funktionieren, indem ich Rekursion verwende. Wenn eine Liste gegeben wird
- Prüfen Sie, ob es sich um eine Integer-Liste handelt, geben Sie sie in diesem Fall zurück.
- andernfalls ist es eine Liste von Listen. FlatMap es (um 1 Verschachtelungsebene zu entfernen) und reduzieren Sie die resultierende Liste.
private static List<Integer> flatten(List<?> list) {
if (list.get(0) instanceof Integer) {
return (List<Integer>) list;
}
List<List<?>> listOfLists = (List<List<?>>) list;
return flatten(listOfLists.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()));
}
dann
public static void main(String[] args) {
List<List<List<List<List<Integer>>>>> listC = Arrays.asList(
Arrays.asList(
Arrays.asList(
Arrays.asList(
Arrays.asList(0, 1),
Arrays.asList(2, 3, 4)
),
Arrays.asList(
Arrays.asList(5),
Arrays.asList(6, 7),
Arrays.asList(8, 9)
)
),
Arrays.asList(
Arrays.asList(
Arrays.asList(10, 11),
Arrays.asList(12, 13, 14)
),
Arrays.asList(
Arrays.asList(15),
Arrays.asList(16, 17),
Arrays.asList(18, 19)
)
)
),
Arrays.asList(
Arrays.asList(
Arrays.asList(
Arrays.asList(20, 21),
Arrays.asList(22, 23, 24)
),
Arrays.asList(
Arrays.asList(25),
Arrays.asList(26, 27),
Arrays.asList(28, 29)
)
),
Arrays.asList(
Arrays.asList(
Arrays.asList(30, 31),
Arrays.asList(32, 33, 34)
),
Arrays.asList(
Arrays.asList(35),
Arrays.asList(36, 37),
Arrays.asList(38, 39)
)
)
)
);
List<Integer> result = flatten(listC);
System.out.println(listC);
System.out.println(result);
}
Drucke
[[[[[0, 1], [2, 3, 4]], [[5], [6, 7], [8, 9]]], [[[10, 11], [12, 13, 14]], [[15], [16, 17], [18, 19]]]], [[[[20, 21], [22, 23, 24]], [[25], [26, 27], [28, 29]]], [[[30, 31], [32, 33, 34]], [[35], [36, 37], [38, 39]]]]]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
Es gibt ein bisschen ungeprüftes Casting, aber ich bin mir nicht sicher, wie ich darauf verzichten soll
Keine Kommentare:
Kommentar veröffentlichen