2017-03-29 32 views
5

Tôi đã rối tung xung quanh với API Java 8 Stream và chạy vào một cái gì đó tôi chỉ có thể làm thông qua các vòng lặp truyền thống.Java - Flatten lồng nhau bản đồ bằng cách sử dụng Stream

Cho một bản đồ lồng nhau của

{ 
    1999: { 
      3: [23, 24, 25], 
      4: [1, 2, 3] 
      }, 
    2001: { 
      11: [12, 13, 14], 
      12: [25, 26, 27] 

      } 
} 

Làm thế nào tôi có thể chuyển đổi này vào

['23,3,1999', '24,3,1999', '25,3,1999', '1,4,1999', '2,4,1999', '3,4,1999', '12,11,2001', '13,11,2001', '14,11,2001', '25,12,2001', '26,12,2001', '27,12,2001'] 

Về cơ bản tôi muốn tái tạo:

Map<Integer, Map<Integer, List<Integer>>> dates... 
    List<String> flattened = new ArrayList<>(); 
    for (Integer key1 : map.keySet()) { 
     for (Integer key2 : map.get(key1).keySet()) { 
      for (Integer value : map.get(key1).get(key2)) { 
       flattened.add(value + "," + key2 + "," + key1); 
      } 
     } 
    } 
+1

Bạn đã thử những gì cho đến nay? – Flown

Trả lời

6

Hãy thử điều này ví dụ:

public static void main(String[] args) { 
    Map<Integer, Map<Integer, List<Integer>>> dates = 
     new HashMap<Integer, Map<Integer, List<Integer>>>() {{ 
      put(1999, new HashMap<Integer, List<Integer>>() {{ 
       put(3, Arrays.asList(23, 24, 25)); 
       put(4, Arrays.asList(1, 2, 3)); 
      }}); 
      put(2001, new HashMap<Integer, List<Integer>>() {{ 
        put(11, Arrays.asList(12, 13, 14)); 
        put(12, Arrays.asList(25, 26, 27)); 
      }}); 
     }}; 

    dates.entrySet().stream().flatMap(year -> 
     year.getValue().entrySet().stream().flatMap(month -> 
      month.getValue().stream() 
       .map(day -> day + "," + month.getKey() + "," + year.getKey()))) 
     .forEach(System.out::println); 
} 

và nếu bạn cần chúng được sắp xếp theo year sau đó month sau đó day thử điều này:

dates.entrySet().stream().flatMap(year -> 
     year.getValue().entrySet().stream().flatMap(month -> 
      month.getValue().stream() 
       .map(day -> Arrays.asList(year.getKey(), month.getKey(), day)))) 
     .sorted(Comparator.comparing(l -> l.get(0)*10000 + l.get(1)*100 + l.get(2))) 
     .forEach(System.out::println); 
3
items 
      .entrySet() 
      .stream() 
      .flatMap(
        l-> l.getValue().entrySet().stream() 
          .flatMap(
            ll->ll.getValue().stream() 
             .map(lll+","+ll.getKey()+","+l.getKey()))) 
      .collect(Collectors.toList()) 
      .forEach(System.out::println); 
1

Giả sử có một Holder có thể mất 3 số nguyên ví dụ:

static class Holder { 

     private final int first; 
     private final int second; 
     private final int third; 
} 

Và những là một số bản đồ lồng nhau, sau đó 2 flatMap sẽ đạt được những gì bạn muốn:

List<Holder> holders = map.entrySet().stream().flatMap(
      e -> e.getValue() 
        .entrySet() 
        .stream() 
        .flatMap(x -> x.getValue().stream().map(y -> new Holder(e.getKey(), x.getKey(), y)))) 
      .collect(Collectors.toList()); 

    System.out.println(holders); 
Các vấn đề liên quan