--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------
Map也是一个集合,只是是以键值对存储的,常见的子类有Hashtable,HashMap,TreeMap。
Hashtable:是1.0版本,底层的数据结构是哈希表,键和值和不能是null值,线程安全,和HashMap比较,效率低。
HashMap:是1.2版本的,底层也是哈希表数据结构,键和值可以为空(null),线程不安全,效率比较高。更确切的说,HashMap是Hashtable的升级版。
TreeMap:可以排序,底层是二叉树。
下面以HashMap为例,介绍一下Map集合。
import java.util.HashMap; import java.util.Map; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); map.put("111", "李四"); map.put("112", "王五"); System.out.println("Map集合中的键和值:" + map); System.out.println("----------------"); /* 利用put方法来添加元素,返回值是当前键以前对应的值,如果没有则返回null *当添加了相同的键,那么新的键和值会替换原来的键和值 * */ System.out.println(map.put("111", "赵六"));//这里返回的是李四,因为此集合中前面有111键对应的值 System.out.println(map.put("113", "王刚"));//此时返回的是null,因为此集合中前面没有与113键对应的值 System.out.println("Map集合中的键和值:" + map); } } 结果: Map集合中的键和值:{112=王五, 110=张三, 111=李四} ---------------- 李四 null Map集合中的键和值:{112=王五, 113=王刚, 110=张三, 111=赵六}
import java.util.HashMap; import java.util.Map; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); map.put("111", "李四"); map.put("112", "王五"); System.out.println("Map集合中的键和值:" + map); /* * 利用booleancontainsKey(Object key)判断集合中是否有此键利用boolean * containsValue(Objectvalue)判断此集合中是否有此值 */ System.out.println("集合中是否包含110键:" + map.containsKey("110")); System.out.println("集合中是否包含000键:" + map.containsKey("000")); System.out.println("集合中是否包含 张三 值:" +map.containsValue("张三")); System.out.println("集合中是否包含 王梅 值:" +map.containsValue("王梅")); } } 结果: Map集合中的键和值:{112=王五, 110=张三, 111=李四} 集合中是否包含110键:true 集合中是否包含000键:false 集合中是否包含 张三 值:true 集合中是否包含 王梅 值:false
import java.util.HashMap; import java.util.Map; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); map.put("111", "李四"); map.put("112", "王五"); map.put("113", "赵六"); System.out.println("Map集合中的键和值:" + map); /* * 利用remove(Objectkey)通过键来删除元素,返回值是此键以前对应的值,如果不存在返回null 利用void * clear()清空集合中的元素 */ System.out.println("删除 110键对应的元素:" + map.remove("110"));// 这里返回是张三 System.out.println("删除 120键对应的元素:" + map.remove("120"));// 这里返回null,因为此集合中没有120对应的值 System.out.println("删除指定元素的集合:" + map); map.clear();// 清空集合 System.out.println("清空集合后的集合:" + map); } } 结果: Map集合中的键和值:{112=王五, 113=赵六, 110=张三, 111=李四} 删除 110键对应的元素:张三 删除 120键对应的元素:null 删除 指定元素的集合:{112=王五, 113=赵六, 111=李四} 清空集合后的集合:{}
import java.util.HashMap; import java.util.Map; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); System.out.println("Map集合中的键和值:" + map); /* * 利用get(Objectkey)获取键对应的单个值,如果不存在,然会null */ System.out.println("获取110对应的值:" + map.get("110"));// 这里返回是张三 System.out.println("获取111对应的值:" + map.get("111"));// 这里返回是null } } 结果: Map集合中的键和值:{110=张三} 获取110对应的值:张三 获取111对应的值:null
package www.fuxi.jihe; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); map.put("111", "李四"); map.put("112", "王五"); System.out.println("Map集合中的键和值:" + map); /* * 利用Set<K>keySet()获取集合中键的集合返回值是Set集合 * 我们可以通过Set集合中的迭代器读取出键,然后再通过get(key)获取元素 */ Set<String> set = map.keySet();// 获得键的集合 Iterator<String> it = set.iterator();// 获得键集合的迭代器 while (it.hasNext()) { String key = it.next(); System.out.println(key + ":" + map.get(key)); } /* * 利用Set<K>keySet()获取集合中键的集合返回值是Set集合然后把集合装换成数组,然后读取也可以 */ System.out.println("----------\n"); Object[] keys = set.toArray(); for (int i = 0; i < keys.length; i++) { System.out.println((String) keys[i] + ":" + map.get((String) keys[i])); } } } 结果: Map集合中的键和值:{112=王五, 110=张三, 111=李四} 112:王五 110:张三 111:李四 ---------- 112:王五 110:张三 111:李四
packagewww.fuxi.jihe; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapDemo { publicstatic void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String,String> map = new HashMap<String, String>(); map.put("110","张三"); map.put("111","李四"); map.put("112","王五"); System.out.println("Map集合中的键和值:" + map); /** * 通过方法Collection<V>values()获得集合中的所有值 */ System.out.println("集合中的值:"); Collection<String>values=map.values(); Iteratorit=values.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }结果: Map集合中的键和值:{112=王五, 110=张三, 111=李四} 集合中的值: 王五 张三 李四
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class MapDemo { public static void main(String[] args) { /* 定义了一个Map集合,键和值的类型都是String */ Map<String, String> map = new HashMap<String, String>(); map.put("110", "张三"); map.put("111", "李四"); map.put("112", "王五"); System.out.println("Map集合中的键和值:" + map); /* * 利用Set<Map.Entry<K,V>>entrySet()获取集合中的映射关系 * 然后通过迭代器读取Set集合 * 然后利用Map.Entry中的K getKey()获得键,V getValue()获取值 */ Set<Map.Entry<String,String>> set=map.entrySet();//获得映射的集合 Iterator<Map.Entry<String,String>> it=set.iterator();//获得迭代器 while(it.hasNext()){ Map.Entry<String, String> en=it.next();//获取集合中的元素 String key=en.getKey(); String value=en.getValue(); System.out.println("键-值:"+key+"-"+value); } } } 结果: Map集合中的键和值:{112=王五, 110=张三, 111=李四} 键-值:112-王五 键-值:110-张三 键-值:111-李四
Map.Entry是Map中的静态接口,此表示的把Map中的元素表示为映射关系
static interface |
Map.Entry<K,V> |
HashMap比较的时候依赖于hashCode()和equals(Object ob)方法
TreeMap可以添加比较器或者是自然排序,对象实现接口comparable。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class HashMapDemo { public static void main(String[] args) { /* 定义HashMap,里面存储的是Student和地址 */ HashMap<Student, String> map = new HashMap<Student, String>(); map.put(new Student("张三", 23), "北京"); map.put(new Student("李四", 24), "上海"); map.put(new Student("王五", 23), "南京"); map.put(new Student("张三", 23), "广州");// 存了一个重复的值 // 第一种读取方式 Set<Student> set = map.keySet(); Iterator<Student> it = set.iterator(); while (it.hasNext()) { Student stu = it.next(); String name = stu.getName(); int age = stu.getAge(); String address = map.get(stu); System.out.println(name + ":" + age + ":" + address); } System.out.println("---------"); System.out.println("下面利用的是映射关系读取"); Set<Map.Entry<Student, String>> ens = map.entrySet(); Iterator<Map.Entry<Student, String>> its =ens.iterator(); while (its.hasNext()) { Map.Entry<Student, String> me = its.next(); Student stu = me.getKey(); String address = me.getValue(); System.out.println(stu.getName()+ ":" + stu.getAge() + ":" + address); } } } 结果: 张三:23:广州 王五:23:南京 李四:24:上海 --------- 下面利用的是映射关系读取 张三:23:广州 王五:23:南京 李四:24:上海
import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { public static void main(String[] args) { /* 定义HashMap,里面存储的是Student和地址 */ TreeMap<Student, String> map = new TreeMap<Student, String>(); map.put(new Student("张三", 23), "北京"); map.put(new Student("李四", 21), "上海"); map.put(new Student("王五", 24), "南京"); map.put(new Student("赵六", 26), "广州"); Set<Student> set = map.keySet(); Iterator<Student> it = set.iterator(); while (it.hasNext()) { Student stu = it.next(); String name = stu.getName(); int age = stu.getAge(); String address = map.get(stu); System.out.println(name + ":" + age + ":" + address); } } } 结果: 李四:21:上海 张三:23:北京 王五:24:南京 赵六:26:广州
从结果可以看出,是按照年龄排序的,所以说TreeSet是具有排序的功能。
那么现在我们自定义比较器,是按照姓名排序。
import java.util.Comparator; public class StuNameComparatorimplements Comparator<Student> { /*按照姓名排序,如果姓名相同,那么按照年龄排序*/ public int compare(Student o1, Student o2) { int num = o1.getName().compareTo(o2.getName()); if (num == 0) { return o1.getAge() - o2.getAge(); } return num; } } import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { public static void main(String[] args) { /* 定义HashMap,里面存储的是Student和地址 */ TreeMap<Student, String> map = new TreeMap<Student, String>(newStuNameComparator()); map.put(new Student("java03", 23), "北京"); map.put(new Student("net02", 21), "上海"); map.put(new Student("java01", 24), "南京"); map.put(new Student("net03", 26), "广州"); Set<Student> set = map.keySet(); Iterator<Student> it = set.iterator(); while (it.hasNext()) { Student stu = it.next(); String name = stu.getName(); int age = stu.getAge(); String address = map.get(stu); System.out.println(name + ":" + age + ":" + address); } } } 结果: java01:24:南京 java03:23:北京 net02:21:上海 net03:26:广州
从结果可以看出,是按照姓名排序的,如果姓名相同,就按照年龄排序。
计算字符串中字符的个数,并且输出格式:a(1)b(3)c(4)….
思路:
1.把字符串转化成字符数组后,然后开始遍历数组
2.在遍历的时候,没读取一个字符,然后在集合中查看,如果存在则读取出来,然后数量加1,然后在存入里面如果没有,则添加里面,数量是1.
3.输出格式,读取集合然后拼接字符串,利用StringBuffer。
packagewww.fuxi.jihe; importjava.util.HashMap; importjava.util.Iterator; importjava.util.Map; importjava.util.Set; public classMapDemo { public static void main(String[] args) { String str ="ahjdkdmkamkmixkxmcsnlasickdj"; char[] cs = str.toCharArray(); HashMap<Character, Integer> map= new HashMap<Character, Integer>(); for (char c : cs) { if (map.containsKey(c)) { Integer count =map.get(c);// 取出此字符对应的数量 count++;// 数量++ map.put(c, count);// 然后重新添加里面,覆盖原来的 } else { map.put(c, newInteger(1));// 开始数量为1 } } StringBuffer bu = new StringBuffer(); Set<Character> set =map.keySet(); Iterator<Character> it =set.iterator(); while (it.hasNext()) { Character c = it.next(); Integer count = map.get(c); bu.append(c).append("(").append(count).append(")"); } System.out.println(bu); } } 结果: d(3)s(2)c(2)a(3)n(1)l(1)m(4)j(2)k(5)h(1)x(2)i(2)
要是使用的是TreeMap,那么就会按照字符排序。
模拟学校,然后读取学校中班级—学生信息
利用的是集合中嵌套集合
package www.fuxi.jihe; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Set; class CollegeStudent { private Stringnum; private Stringname; CollegeStudent(Stringnum, String name) { super(); this.num =num; this.name =name; } public StringgetNum() { return num; } public StringgetName() { returnname; } } public class Demo { public staticvoid main(String[] agrs) { /* 学校 */ HashMap<String,List<CollegeStudent>> bdxy = new HashMap<String,List<CollegeStudent>>(); List<CollegeStudent>ruanjian = new ArrayList<CollegeStudent>();// 软件班 List<CollegeStudent>jiying = new ArrayList<CollegeStudent>();// 计应班 /* 把班级添加到学校中 */ bdxy.put("ruanjian",ruanjian); bdxy.put("jiying",jiying); /*向班级中添加学生*/ ruanjian.add(newCollegeStudent("110","zhansgan") ); ruanjian.add(newCollegeStudent("111","lisi") ); ruanjian.add(newCollegeStudent("112","王五")); jiying.add(newCollegeStudent("210","wangang") ); jiying.add(newCollegeStudent("211","wangemi") ); jiying.add(newCollegeStudent("212","xiaoqiang") ); /* 遍历学校中的班级,然后读取班级中的学生信息 */ Set<String>set = bdxy.keySet();// 获取班级名称集合 Iterator<String>it = set.iterator(); while(it.hasNext()) { StringClassName = it.next(); List<CollegeStudent>ClassInfo = bdxy.get(ClassName);// 获得班级 System.out.println(ClassName); show(ClassInfo); } } /* 输出班级的学生 */ public staticvoid show(List<CollegeStudent> list) { Iterator<CollegeStudent>it = list.iterator(); while(it.hasNext()) { CollegeStudentstu = it.next(); System.out.println(" |-"+stu.getNum() + ":" +stu.getName()); } } } 结果: jiying |-210:wangang |-211:wangemi |-212:xiaoqiang ruanjian |-110:zhansgan |-111:lisi |-112:王五
package www.fuxi.jihe; import java.util.HashMap; import java.util.Map; public class Text { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); map.put("110", "zhangsan"); map.put("111", "lisi"); map.put("112", "wangwu"); System.out.println("集合:"+map); /*boolean isEmpty()判断是否为空*/ System.out.println(map.isEmpty()); /*int size()判断集合中映射关系的个数*/ System.out.println("大小:"+map.size()); } } 结果: 集合:{112=wangwu, 110=zhangsan, 111=lisi} false 大小:3
--------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! --------------------