Java数据结构精进:优化HashMapList的冗余设计

2024-07-15 10:51:39 浏览数 (3)

HashMapList<T, E>

HashMapList类本质上是HashMap<T, Arraylist<E>>的简写,从类型为 T 的项映射到类型为 E 的 Arraylist。

冗余代码

代码语言:java复制
 	HashMap<Integer, Arraylist<String>> maplist = new HashMap<Integer, Arraylist<String>>();
 	  for (String s : strings) {
 		int key = computeValue(s);
  		if (!maplist.containsKey(key)) {
 			maplist.put(key, new Arraylist<String>());
 	}
 		maplist.get(key).add(s);
 	}

现在,可以这样写为:

代码语言:java复制
   HashMaplist<Integer, String> maplist new HashMapList<Integer, String>();
        for (String s : strings) {
            int key = computeValue(s);
            if (!maplist.computeValue(s));
            maplist.put(key, s);
         }

代码实现

HashMapList<T, E>类中:

  • T 通常代表键(key)的类型。
  • E 通常代表值(value)的类型。
代码语言:java复制
public class HashMapList<T, E> {
    private HashMap<T, Arraylist<E>> map = new HashMap<T, Arraylist<E>>();

    /* key插入项item*/
    public void put(T key, E item) {
        if (!map.containsKey(key)) {
            map.put(key, new Arraylist<E>());
        }
        map.get(key).add(item);
    }

    /* 键key插入项列表*/
    public void put(T key, Arraylist<E> items) {
        map.put(key, items);
    }

    /* 获取key的项列表 */
    public Arraylist<E> get(T key) {
        return map.get(key);
    }

    /* 检查hashmaplist是否包含key*/
    public boolean containsKey(T key) {
        return map.containsKey(key);
    }

    /* 检查key的列表是否包含value*/
    public boolean containsKeyValue(T key, E value) {
        Arraylist<E> list = get(key);
        if (list == null) return false;
        return list.contains(value);
    }

    /* 获取key列表*/
    public Set<T> keySet() {
        return map.keySet();
    }

    @Override
    public String toString() {
        return map.toString();
    }
}

使用示例

代码语言:java复制
public class HashMapListExample {
    public static void main(String[] args) {
        //创建一个HashMapList
        HashMapList<String, Integer> mapList = new HashMapList<>();
        //mapList添加数据
        mapList.put("年龄", 25);
        mapList.put("年龄", 30);
        mapList.put("分数", 85);
        mapList.put("分数", 90);
        //输出整个mapList
        System.out.println(mapList.toString());
        //获取键"年龄"下的全部值
        ArrayList<Integer> ages = mapList.get("年龄");
        System.out.println("年龄列表: "   ages.toString());
        //检查是否包含键"分数"
        boolean Scores = mapList.containsKey("分数");
        System.out.println("是否包含'分数'键: "   Scores);
    }
}

结论

HashMapList类提供了管理键和列表的映射关系,减少了代码冗余,提高了代码的可读性和维护性。

谢谢大家阅读:)

1 人点赞