JAVA中集合HashMap与List嵌套案例

本文介绍了一个用于管理和查询地区数据(包括省、市、县)的Java类实现。通过使用哈希映射来组织数据,该类能够高效地列出指定省份的所有城市和县区,并能返回特定省份县区的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情景描述

  1. 有这样一组数据”henan zhengzhou gongyi,henan zhengzhou xingyang,henan Kaifeng lankao,Jiangsu Suzhou gusu,jiangsu nanjing xuanwu“。每个单元用‘,’分割。单元内三个单词的意思分别是省,市,县(区)。请设计一个类,要求将上述数据存入后,拥有以下功能:

    1. 给定一个省可以列举出该省所有的市。

    2. 给定一个省可以列举出该省所有的县(区)。

    3. 给定一个省可以查到该省县(区)的数量。

代码实现

代码中带有详细的注解说明。

测试类
import java.util.*;

public class HomeWork {
    public static void main(String[] args) {

        String date = "henan zhengzhou gongyi,henan zhengzhou xingyang,henan Kaifeng lankao,Jiangsu Suzhou gusu,jiangsu nanjing xuanwu";
        RegionUtil.loadData(date);
        RegionUtil.getCitys("henan");
        RegionUtil.getCountries("henan");
        RegionUtil.getCountrieNumber("henan");

    }

}

import java.util.*;

public class RegionUtil {
    //用来存储地区数据
    private static HashMap<String,Map> hashMap = new HashMap();
    //用来初始化数据
    public static void loadData(String date) {
        //先将字符串按照“,”分割
        String[] split = date.split(",");
        //再遍历数组分别将省市县归类
        for (int i = 0; i < split.length; i++) {
            String[] strings = split[i].split(" ");
            //省分
            String province = strings[0];
            //市
            String city = strings[1];
            //县(乡镇)
            String country = strings[2];
            //在存放省-市的map集合中,找hashmap中是否存在省,若存在将省所对应的市,放入value中,value又是一个map集合
            if (hashMap.containsKey(province)){
                //如果已存在,则将省对应的市添加到citys的HashMap中
                HashMap citys = (HashMap) hashMap.get(province);
                if (citys.containsKey(city)){
                    //如果包含了则将对应的县添加到list集合中
                    List countries = (List) citys.get(city);
                    countries.add(country);
                    citys.put(city,countries);
                }else {
                    //如果不存在市
                    List<String> list = new ArrayList<>();
                    list.add(country);
                    citys.put(city,list);
                }
            }else {
                //如果不存在省
                //创建list用来存放县
                ArrayList<String> list = new ArrayList<>();
                list.add(country);
                //创建HashMap用来保存市
                HashMap<String, List> map = new HashMap<>();
                map.put(city,list);
                //添加省-市
                hashMap.put(province,map);
            }
        }
    }

    public static void getCitys(String province) {
        //获取省
        HashMap map = (HashMap) hashMap.get(province);
        for (Object key :
                map.keySet()) {
            System.out.println("city:"+key);
        }
    }
    public static void getCountries(String province) {
        //获取县
        HashMap map = (HashMap) hashMap.get(province);
        for (Object key :
                map.keySet()) {
            System.out.println("country:"+map.get(key));
        }
    }
    public static void getCountrieNumber(String province) {
        //获取县的个数
        HashMap map = (HashMap) hashMap.get(province);
        int count = 0;
        for (Object key :
                map.keySet()) {
            count+=((List)map.get(key)).size();
        }
        System.out.println("size:"+count);
    }
}
### Java 泛型集合详解 #### 1. 泛型的概念 泛型是一种允许在定义类、接口或方法时指定一个占位符(通常为`<T>`),以便在实际使用时由具体的类型替代的技术。这种机制使得代码更加灵活和安全,因为它可以在编译阶段捕获类型不匹配的错误。 Java中的泛型实际上是一颗语法糖[^3],通过**类型擦除**的方式实现。这意味着在运行时,泛型的信息会被移除,所有的泛型实例都会被还原为其原始类型(Raw Type)。例如,`ArrayList<Integer>` 和 `ArrayList<String>` 在运行时都被视为普通的 `ArrayList` 类型。 --- #### 2. 泛型的基本语法 以下是泛型的一些基本用法: ##### (1) 定义泛型类 可以通过 `<T>` 来声明一个泛型参数: ```java public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } ``` 在这个例子中,`Box` 是一个可以存储任何类型的容器。 ##### (2) 使用泛型方法 即使在一个非泛型类中,也可以定义泛型方法: ```java public class Util { public static <T> void printArray(T[] array) { for (T element : array) { System.out.println(element); } } } ``` 调用该方法时,无需显式指定类型参数,编译器会自动推断其类型。 ##### (3) 泛型通配符 当无法确定具体类型时,可以使用通配符 `<?>` 或带有限制的通配符来代替特定类型。 - **无界通配符 (`<?>`)** 表示未知类型,适用于不需要操作泛型内部对象的情况。 - **上限通配符 (`<? extends E>`)** 表示可以传递 `E` 及其子类类型。 - **下限通配符 (`<? super E>`)** 表示可以传递 `E` 及其父类类型[^4]。 --- #### 3. 集合框架中的泛型应用 Java集合框架广泛使用了泛型技术,以提高代码的安全性和可读性。 ##### (1) List 接口及其实现 `List` 是一种有序集合,支持重复元素。常见的实现类包括 `ArrayList` 和 `LinkedList`。 ```java import java.util.ArrayList; public class Example { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("Hello"); String item = list.get(0); // 编译器确保返回的是字符串类型 } } ``` ##### (2) Map 接口及其实现 `Map` 存储键值对,其中键唯一而值可以重复。常用的实现类有 `HashMap` 和 `TreeMap`。 ```java import java.util.HashMap; public class Example { public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(); map.put(1, "One"); String value = map.get(1); // 获取对应键的值 } } ``` --- #### 4. 泛型的最佳实践 为了充分利用泛型的优势并避免潜在问题,建议遵循以下原则: - **优先使用泛型**:相比于原始类型(Raw Type),泛型提供了更强的类型安全性。 - **合理使用通配符**:根据需求选择合适的上下限通配符,而不是简单地使用无界通配符。 - **避免不必要的复杂性**:过多嵌套的泛型可能会降低代码的可读性。 - **注意类型擦除的影响**:由于泛型信息会在运行时丢失,某些情况下可能需要借助反射或其他手段获取类型信息[^3]。 --- #### 5. 练习案例分析 考虑如下代码片段: ```java public class Test { public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<>(); ArrayList<Double> list2 = new ArrayList<>(); processNumbers(list1); //processNumbers(list2); // 编译失败 } public static void processNumbers(ArrayList<? extends Number> numbers) { for (Number number : numbers) { System.out.println(number.doubleValue()); } } } ``` 在此例中,`processNumbers` 方法接收了一个带有上限通配符的列表作为参数。这表明它可以处理所有实现了 `Number` 接口的具体类型(如 `Integer`, `Double` 等)[^2]。 然而需要注意的是,尽管我们可以从中读取数据,却不能向此类集合添加新元素(除了 `null` 外),因为编译器无法确认所添加项的实际类型是否兼容。 --- ### 总结 Java 中的泛型提供了一种强大的工具,用于编写既通用又类型安全的代码。理解其背后的原理(如类型擦除)、掌握常见用法以及熟悉最佳实践,可以帮助开发者更高效地利用这一特性解决实际问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脸ル粉嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值