2015-02-27 22 views
8

Tôi đang sử dụng Java 8 để nhóm theo dữ liệu. Nhưng kết quả thu được không theo thứ tự hình thành.Java 8 không duy trì thứ tự trong khi nhóm

Map<GroupingKey, List<Object>> groupedResult = null; 

     if (!CollectionUtils.isEmpty(groupByColumns)) { 

      Map<String, Object> mapArr[] = new LinkedHashMap[mapList.size()]; 

      if (!CollectionUtils.isEmpty(mapList)) { 
       int count = 0; 
       for (LinkedHashMap<String, Object> map : mapList) { 
        mapArr[count++] = map; 
       } 
      } 
      Stream<Map<String, Object>> people = Stream.of(mapArr); 
      groupedResult = people 
        .collect(Collectors.groupingBy(p -> new GroupingKey(p, groupByColumns), Collectors.mapping((Map<String, Object> p) -> p, toList()))); 


public static class GroupingKey 

     public GroupingKey(Map<String, Object> map, List<String> cols) { 

      keys = new ArrayList<>(); 

      for (String col : cols) { 
       keys.add(map.get(col)); 
      } 
     } 

     // Add appropriate isEqual() ... you IDE should generate this 
     @Override 
     public boolean equals(Object obj) { 
      if (obj == null) { 
       return false; 
      } 
      if (getClass() != obj.getClass()) { 
       return false; 
      } 
      final GroupingKey other = (GroupingKey) obj; 
      if (!Objects.equals(this.keys, other.keys)) { 
       return false; 
      } 
      return true; 
     } 

     @Override 
     public int hashCode() { 
      int hash = 7; 
      hash = 37 * hash + Objects.hashCode(this.keys); 
      return hash; 
     } 

     @Override 
     public String toString() { 
      return keys + ""; 
     } 

     public ArrayList<Object> getKeys() { 
      return keys; 
     } 

     public void setKeys(ArrayList<Object> keys) { 
      this.keys = keys; 
     } 

    } 

Ở đây tôi đang sử dụng nhóm lớp học của mìnhTừ đó tôi tự động chuyển từ ux. Làm thế nào có thể nhận được groupByColumns này ở dạng được sắp xếp?

Trả lời

27

Không duy trì thứ tự là tài sản của Map lưu trữ kết quả. Nếu bạn cần một hành vi cụ thể của Map, bạn cần phải request a particular Map implementation. Ví dụ. LinkedHashMap duy trì trật tự chèn:

groupedResult = people.collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns), 
    LinkedHashMap::new, 
    Collectors.mapping((Map<String, Object> p) -> p, toList()))); 

Bằng cách này, không có lý do gì để sao chép nội dung của mapList vào một mảng trước khi tạo Stream. Bạn có thể chỉ cần gọi mapList.stream() để nhận được Stream thích hợp.

Hơn nữa, Collectors.mapping((Map<String, Object> p) -> p, toList()) đã lỗi thời. p->p là một bản đồ sắc, vì vậy không có lý do để yêu cầu mapping tại tất cả:

groupedResult = mapList.stream().collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns), LinkedHashMap::new, toList())); 

Nhưng ngay cả những GroupingKey là lỗi thời. Về cơ bản nó kết thúc một giá trị List, vì vậy bạn chỉ có thể sử dụng một số List làm vị trí đầu tiên. List s triển khai hashCodeequals một cách thích hợp (nhưng bạn không được sửa đổi những phím này List giây sau đó).

Map<List<Object>, List<Object>> groupedResult= 
    mapList.stream().collect(Collectors.groupingBy(
    p -> groupByColumns.stream().map(p::get).collect(toList()), 
    LinkedHashMap::new, toList())); 
+0

Thanx Holger u làm nhiệm vụ của tôi trở nên đơn giản hơn. Nhưng tôi vẫn có vấn đề rằng nếu tôi muốn áp dụng phân loại trong này chỉ mở rộng groupedColumns này sau đó wat tôi nên làm gì? – shreya

Các vấn đề liên quan