【问题标题】:Group/Sort a Map<key, value > by values (Java)按值对 Map<key, value > 进行分组/排序(Java)
【发布时间】:2017-07-17 11:16:01
【问题描述】:

我有一个 Item 对象的 LinkedHashMap。项目有 itemId 和 Color。我想对我的地图数据进行排序和分组,地图是根据插入顺序以及分组颜色进行排序的。

让我用例子来演示

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);

经过排序和分组逻辑后,map应该如下:

{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']
}

基本上,地图应该首先包含所有具有红色的项目对象(首先插入),然后是具有黑色的项目对象,最后是具有绿色的项目对象。

【问题讨论】:

标签: java sorting grouping


【解决方案1】:
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 + '\'' +
                '}';
    }
}

【讨论】:

    【解决方案2】:

    使用key:colorvalue:List&lt;ItemVO&gt; 创建一个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 对象。

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2015-06-30
      • 2016-10-04
      • 2014-12-11
      相关资源
      最近更新 更多