Advertisement
CSenshi

FlattenList.java (Map/Reduce)

Aug 30th, 2020
2,221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.29 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.stream.Collectors;
  5.  
  6. public class Flatten {
  7.  
  8.     public static List<Object> list(Object... args) {
  9.         return Arrays.asList(args);
  10.     }
  11.  
  12.     public static void main(String[] args) {
  13.         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);
  14.         List<Integer> result = flattenList(list);
  15.         for (Integer i : result)
  16.             System.out.print(i + " ");
  17.     }
  18.  
  19.     /* Input  ----- [1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, [16, 17, [18, 19]]], 20]
  20.      *
  21.      *  0     ----- flattenList([1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, [16, 17, [18, 19]]], 20])
  22.      *  0     ----- flattenList([1, 3, 5, flattenList([6, 7]), 8, 9, 10, flattenList([11, 13, 14, 15, [16, 17, [18, 19]]], 20]))
  23.      *  1.1   ----- flattenList([6, 7]) = [6, 7]
  24.      *  1.2   ----- flattenList([11, 13, 14, 15, [16, 17, [18, 19]]]=
  25.      *                  = flattenList([11, 13, 14, 15, flattenList([16, 17, [18, 19]])])
  26.      *                  = flattenList([11, 13, 14, 15, flattenList([16, 17, flattenList([18, 19])]]))
  27.      *                  = flattenList([11, 13, 14, 15, flattenList([16, 17, [18, 19]])])
  28.      *                  = flattenList([11, 13, 14, 15, [16, 17, 18, 19]])
  29.      *                  = flattenList([11, 13, 14, 15, [16, 17, 18, 19]])
  30.      *                  = [11, 13, 14, 15, 16, 17, 18, 19]
  31.      *
  32.      * 1.1 = [6, 7]
  33.      * 1.2 = [11, 13, 14, 15, 16, 17, 18, 19]
  34.      *
  35.      * დავუბრუნდეთ მე-0 ეტაპს და ჩავსვათ 1.1 და 1.2 პასუხები
  36.      *
  37.      * 0     -----  flattenList([1, 3, 5, [6, 7], 8, 9, 10, [11, 13, 14, 15, 16, 17, 18, 19]])
  38.      *                  = [1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19]
  39.      *
  40.      * P.S. აქ ყველაზე დამაბნეველი არის რეკურსიიდან ამოსვლისას თუ როგორ ერთიანდება ლისტები ერთმანეთში
  41.      *  1. flattenList() ვიცით, რომ გვიბრუნებს ერთ დონიან მასივს (მაგ: flattenList([1, [2, [3,4]]]) = [1, 2, 3, 4]
  42.      *  2. მეორე და მთავარი მომენტია რომ ჩვენ საწყისად ცარიელ ლისტს ვიღებთ (ჩვენს შემთხვევაში left ქვია reduce-ში,
  43.      *     ხოლო შემდეგ თუ ელემენტი ინტია პირდაპირ ვამატებთ left-ში
  44.      *     წინააღმდეგ შემთხვევაში (ანუ ლისტია) ჯერ ლისტსზე ვიძახებთ flattenList-ს,
  45.      *     რის შემდეგაც უეჭველი ვიცით რომ ინტების ლისტი დაგვიბრუნდება და ამ დაბრუნებული ლისტის თითოეულ ელემენტს ჩავამატებთ left ლისტში
  46.      */
  47.  
  48.     private static List<Integer> flattenList(Object list) {
  49.         return (List<Integer>) ((List<Object>) list)
  50.                 .stream()
  51.                 .reduce(new ArrayList<>(), (left, right) -> {
  52.                     if (right instanceof Integer)
  53.                         ((List) left).add(right);
  54.                     else
  55.                         // და-flatten-ებულ ლისტს გადავუაროთ და თითოეული ელემენტი ჩავაგდოთ left ლისტში
  56.                         flattenList(right)
  57.                                 .stream()
  58.                                 .map(elem -> ((List)left).add(elem))
  59.                                 .collect(Collectors.toList());
  60.                         // ამის გაკეთება უფრო მარტივადაც შეგვიძლია შემდეგნაირად:
  61.                         // ((List) left).addAll(flattenList(right));
  62.                     return left;
  63.                 });
  64.     }
  65. }
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement