Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.stream.Collectors;
- public class Flatten {
- public static List<Object> list(Object... args) {
- return Arrays.asList(args);
- }
- public static void main(String[] args) {
- List<Object> list = list(1, 3, 5, list(6, 7), 8, 9, 10, list(11, 13, 14, 15, list(16, 17, list(18, 19))), 20);
- List<Integer> result = flattenList(list);
- for (Integer i : result)
- System.out.print(i + " ");
- }
- /* Input ----- [1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, [16, 17, [18, 19]]], 20]
- *
- * 0 ----- flattenList([1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, [16, 17, [18, 19]]], 20])
- * 0 ----- flattenList([1, 3, 5, flattenList([6, 7]), 8, 9, 10, flattenList([11, 13, 14, 15, [16, 17, [18, 19]]], 20]))
- * 1.1 ----- flattenList([6, 7]) = [6, 7]
- * 1.2 ----- flattenList([11, 13, 14, 15, [16, 17, [18, 19]]]=
- * = flattenList([11, 13, 14, 15, flattenList([16, 17, [18, 19]])])
- * = flattenList([11, 13, 14, 15, flattenList([16, 17, flattenList([18, 19])]]))
- * = flattenList([11, 13, 14, 15, flattenList([16, 17, [18, 19]])])
- * = flattenList([11, 13, 14, 15, [16, 17, 18, 19]])
- * = flattenList([11, 13, 14, 15, [16, 17, 18, 19]])
- * = [11, 13, 14, 15, 16, 17, 18, 19]
- *
- * 1.1 = [6, 7]
- * 1.2 = [11, 13, 14, 15, 16, 17, 18, 19]
- *
- * დავუბრუნდეთ მე-0 ეტაპს და ჩავსვათ 1.1 და 1.2 პასუხები
- *
- * 0 ----- flattenList([1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, 16, 17, 18, 19]])
- * = [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19]
- *
- * P.S. აქ ყველაზე დამაბნეველი არის რეკურსიიდან ამოსვლისას თუ როგორ ერთიანდება ლისტები ერთმანეთში
- * 1. flattenList() ვიცით, რომ გვიბრუნებს ერთ დონიან მასივს (მაგ: flattenList([1, [2, [3,4]]]) = [1, 2, 3, 4]
- * 2. მეორე და მთავარი მომენტია რომ ჩვენ საწყისად ცარიელ ლისტს ვიღებთ (ჩვენს შემთხვევაში left ქვია reduce-ში,
- * ხოლო შემდეგ თუ ელემენტი ინტია პირდაპირ ვამატებთ left-ში
- * წინააღმდეგ შემთხვევაში (ანუ ლისტია) ჯერ ლისტსზე ვიძახებთ flattenList-ს,
- * რის შემდეგაც უეჭველი ვიცით რომ ინტების ლისტი დაგვიბრუნდება და ამ დაბრუნებული ლისტის თითოეულ ელემენტს ჩავამატებთ left ლისტში
- */
- private static List<Integer> flattenList(Object list) {
- return (List<Integer>) ((List<Object>) list)
- .stream()
- .reduce(new ArrayList<>(), (left, right) -> {
- if (right instanceof Integer)
- ((List) left).add(right);
- else
- // და-flatten-ებულ ლისტს გადავუაროთ და თითოეული ელემენტი ჩავაგდოთ left ლისტში
- flattenList(right)
- .stream()
- .map(elem -> ((List)left).add(elem))
- .collect(Collectors.toList());
- // ამის გაკეთება უფრო მარტივადაც შეგვიძლია შემდეგნაირად:
- // ((List) left).addAll(flattenList(right));
- return left;
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement