2017-07-17 21 views
0

我有一個Item對象的LinkedHashMap。 Item有itemId和Color。我想對地圖數據進行排序和分組,根據插入順序對地圖進行排序,並對顏色進行分組。按值分組/排序地圖<key, value >(Java)

讓我與例如

Map<String, ItemVO> itemChildMap = new LinkedHashMap<String, ItemVO>(); 

    ItemVO item1 = new ItemVO("98091", "Red"); 
    ItemVO item2 = new ItemVO("32456", "Black"); 
    ItemVO item3 = new ItemVO("12323", "Green"); 
    ItemVO item4 = new ItemVO("78956", "Red"); 
    ItemVO item5 = new ItemVO("11231", "Green"); 
    ItemVO item6 = new ItemVO("10098", "Black"); 
    ItemVO item7 = new ItemVO("23410", "Red"); 

    itemChildMap.put("98091", item1); 
    itemChildMap.put("32456", item2); 
    itemChildMap.put("12323", item3); 
    itemChildMap.put("78956", item4); 
    itemChildMap.put("11231", item5); 
    itemChildMap.put("10098", item6); 
    itemChildMap.put("23410", item7); 

演示排序和分組邏輯後,地圖應當如下:

{98091=ItemVO [itemId='98091', color='Red'] 
, 78956=ItemVO [itemId='78956', color='Red'] 
, 23410=ItemVO [itemId='23410', color='Red'] 
, 32456=ItemVO [itemId='32456', color='Black'] 
, 10098=ItemVO [itemId='10098', color='Black'] 
, 12323=ItemVO [itemId='12323', color='Green'] 
, 11231=ItemVO [itemId='11231', color='Green'] 
} 

基本上,地圖應當首先包含具有紅顏色的所有項目的對象(其有先插入),然後是具有黑色的項目對象,以及具有綠色的最後一個項目對象。

+1

我曾經需要同樣的事情。這有助於:[https://stackoverflow.com/a/2581754/7399631](https://stackoverflow.com/a/2581754/7399631) – mumpitz

+5

[按值排序圖(Java)](https ://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java) –

+0

你想在分組後繼續維持插入順序嗎? –

回答

0
public static void main(String[] args){ 
    Map<String, ItemVO> itemChildMap = new LinkedHashMap<String, ItemVO>(); 

    ItemVO item1 = new ItemVO("100", "Black"); 
    ItemVO item2 = new ItemVO("101", "Red"); 
    ItemVO item3 = new ItemVO("102", "Black"); 
    ItemVO item4 = new ItemVO("103", "Green"); 
    ItemVO item5 = new ItemVO("104", "Red"); 
    ItemVO item6 = new ItemVO("105", "Green"); 
    ItemVO item7 = new ItemVO("106", "Black"); 

    itemChildMap.put("100", item1); 
    itemChildMap.put("101", item2); 
    itemChildMap.put("102", item3); 
    itemChildMap.put("103", item4); 
    itemChildMap.put("104", item5); 
    itemChildMap.put("105", item6); 
    itemChildMap.put("106", item7); 

    List<Map.Entry<String, ItemVO>> entries = new ArrayList<>(itemChildMap.entrySet()); 

    Comparator<Map.Entry<String, ItemVO>> comparatorByColor = new Comparator<Map.Entry<String, ItemVO>>() { 
     @Override 
     public int compare(Map.Entry<String, ItemVO> o1, Map.Entry<String, ItemVO> o2) { 
      return o1.getValue().getColor().compareTo(o2.getValue().getColor()); 
     } 
    }; 

    Comparator<Map.Entry<String, ItemVO>> comparatorById = new Comparator<Map.Entry<String, ItemVO>>() { 
     @Override 
     public int compare(Map.Entry<String, ItemVO> o1, Map.Entry<String, ItemVO> o2) { 
      return o1.getValue().getId().compareTo(o2.getValue().getId()); 
     } 
    }; 

    System.out.println(itemChildMap); 
    Collections.sort(entries, comparatorByColor.thenComparing(comparatorById)); 
    itemChildMap.clear(); 
    for (Map.Entry<String, ItemVO> entry : entries) { 
     itemChildMap.put(entry.getKey(), entry.getValue()); 
    } 
    System.out.println(itemChildMap); 
} 

static class ItemVO { 
    String id; 
    String color; 

    public ItemVO(String id, String color) { 
     this.id = id; 
     this.color = color; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

    @Override 
    public String toString() { 
     return "ItemVO{" + 
       "id='" + id + '\'' + 
       ", color='" + color + '\'' + 
       '}'; 
    } 
} 
0

創建LinkedHashMapkey:colorvalue:List<ItemVO>

迭代itemChildMap並將ItemVO添加到LinkedHashMap(colorItemListMap)

然後遍歷colorItemListMap並將所有ItemVO添加到LinkedHashMap(sortedItemMap)

public Map<String, ItemVO> sortItemMap(Map<String, ItemVO> itemChildMap) { 
    Map<String, ItemVO> sortedItemMap = new LinkedHashMap<>(); 
    Map<String, List<ItemVO>> colorItemListMap = new LinkedHashMap<String, List<ItemVO>>(); 
    for (Map.Entry<String, ItemVO> itemEntry : itemChildMap.entrySet()) { 
     String color = itemEntry.getValue().getColor(); 
     if (!colorItemListMap.containsKey(color)) { 
      List<ItemVO> list = new ArrayList<ItemVO>(); 
      list.add(itemEntry.getValue()); 
      colorItemListMap.put(color, list); 
     } else { 
      colorItemListMap.get(color).add(itemEntry.getValue()); 
     } 
    } 
    for (Entry<String, List<ItemVO>> entry : colorItemListMap.entrySet()) { 
     for (ItemVO itemObj : entry.getValue()) 
      sortedItemMap.put(itemObj.getItemId(), itemObj); 
    } 
    System.out.println(sortedItemMap);  
    return sortedItemMap; 
} 

sortedItemMap包含已排序和分組的ItemVO對象。

相關問題