2017-07-17 7 views
0

私はItemオブジェクトのLinkedHashMapを持っています。 ItemにitemIdとColorがあります。マップを並べ替えてグループ化し、マップが挿入シーケンスに基づいてソートされ、グループ化された色とともにソートされるようにしたい。マップをグループ化/ソート<key, value > by values(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

key:colorvalue:List<ItemVO>LinkedHashMapを作成します。

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オブジェクトが含まれます。