语法使用

Java HashMap

HashMap 是 Map 族中最为常用的一种,也是 Java Collection Framework 的重要成员。

创建

Collections.singletonMap("server.port", "8083")

增删操作

访问遍历

我们常用的遍历 HashMap 的方式有以下几种:

  • 使用 Map 的 forEach 方法加上 Java8 的 lambda 表达式:
aMap.forEach( (k,v)->{System.out.println(k+" "+v);} );
  • 使用 Map.Entry 来遍历 Map 的条目:
for(Map.Entry<String, String> it : aMap.entrySet()){
	System.out.println(it.getKey()+"="+it.getValue());
	System.out.println(it);
}
  • 使用 for 结合 Map 的 keySet 和 values 方法来遍历:
for(String a : aMap.keySet()){
	System.out.println(a);
}

for(String a : aMap.values()){
	System.out.println(a);
}
  • 使用迭代器, 这种是看起来比较熟悉而且效率挺高的, 但是要注意, 不能在使用 for 循环访问迭代器的同时使用 remove 操作, javadoc 说这样会发生不可预期的错误, 如果希望迭代的同时删除元素, 可以使用 while 来遍历:
for(Iterator<Map.Entry<String, String>> it = aMap.entrySet().iterator();it.hasNext();){
	Map.Entry<String, String> itt = it.next();
	System.out.println(itt.getKey()+"="+itt.getValue());
	System.out.println(itt);
}

统计操作

Sort | 排序

按键排序

public Map<String, String> sortMapByKey(Map<String, String> oriMap) {
    if (oriMap == null || oriMap.isEmpty()) {
        return null;
    }
    Map<String, String> sortedMap = new TreeMap<String, String>(new Comparator<String>() {
        public int compare(String key1, String key2) {
            int intKey1 = 0, intKey2 = 0;
            try {
                intKey1 = getInt(key1);
                intKey2 = getInt(key2);
            } catch (Exception e) {
                intKey1 = 0;
                intKey2 = 0;
            }
            return intKey1 - intKey2;
        }});
    sortedMap.putAll(oriMap);
    return sortedMap;
}

private int getInt(String str) {
    int i = 0;
    try {
        Pattern p = Pattern.compile("^\\d+");
        Matcher m = p.matcher(str);
        if (m.find()) {
            i = Integer.valueOf(m.group());
        }
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    return i;
}

按值排序

public Map<String, String> sortMapByValue(Map<String, String> oriMap) {
    Map<String, String> sortedMap = new LinkedHashMap<String, String>();
    if (oriMap != null && !oriMap.isEmpty()) {
        List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(oriMap.entrySet());
        Collections.sort(entryList,
                new Comparator<Map.Entry<String, String>>() {
                    public int compare(Entry<String, String> entry1,
                            Entry<String, String> entry2) {
                        int value1 = 0, value2 = 0;
                        try {
                            value1 = getInt(entry1.getValue());
                            value2 = getInt(entry2.getValue());
                        } catch (NumberFormatException e) {
                            value1 = 0;
                            value2 = 0;
                        }
                        return value2 - value1;
                    }
                });
        Iterator<Map.Entry<String, String>> iter = entryList.iterator();
        Map.Entry<String, String> tmpEntry = null;
        while (iter.hasNext()) {
            tmpEntry = iter.next();
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
        }
    }
    return sortedMap;
}

应用示例

数组转化为树

/** 菜单DO类 */
@Setter
@Getter
@ToString
public static class MenuDO {
    /** 菜单标识 */
    private Long id;
    /** 菜单父标识 */
    private Long parentId;
    /** 菜单名称 */
    private String name;
    /** 菜单链接 */
    private String url;
}

/** 菜单VO类 */
@Setter
@Getter
@ToString
public static class MenuVO {
    /** 菜单标识 */
    private Long id;
    /** 菜单名称 */
    private String name;
    /** 菜单链接 */
    private String url;
    /** 子菜单列表 */
    private List<MenuVO> childList;
}

/** 构建菜单树函数 */
public static List<MenuVO> buildMenuTree(List<MenuDO> menuList) {
    // 检查列表为空
    if (CollectionUtils.isEmpty(menuList)) {
        return Collections.emptyList();
    }

    // 依次处理菜单
    int menuSize = menuList.size();
    List<MenuVO> rootList = new ArrayList<>(menuSize);
    Map<Long, MenuVO> menuMap = new HashMap<>(menuSize);
    for (MenuDO menuDO : menuList) {
        // 赋值菜单对象
        Long menuId = menuDO.getId();
        MenuVO menu = menuMap.get(menuId);
        if (Objects.isNull(menu)) {
            menu = new MenuVO();
            menu.setChildList(new ArrayList<>());
            menuMap.put(menuId, menu);
        }
        menu.setId(menuDO.getId());
        menu.setName(menuDO.getName());
        menu.setUrl(menuDO.getUrl());

        // 根据父标识处理
        Long parentId = menuDO.getParentId();
        if (Objects.nonNull(parentId)) {
            // 构建父菜单对象
            MenuVO parentMenu = menuMap.get(parentId);
            if (Objects.isNull(parentMenu)) {
                parentMenu = new MenuVO();
                parentMenu.setId(parentId);
                parentMenu.setChildList(new ArrayList<>());
                menuMap.put(parentId, parentMenu);
            }

            // 添加子菜单对象
            parentMenu.getChildList().add(menu);
        } else {
            // 添加根菜单对象
            rootList.add(menu);
        }
    }

    // 返回根菜单列表
    return rootList;
}
上一页