Map集合的功能梳理:
添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
获取功能
Set<Map.Entry<K,V>> entrySet():
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
长度功能
int size():返回集合中的键值对的个数
Map类集合也有三种遍历方式:
使用迭代器进行遍历
使用增强For循环来进行遍历
使用Map.Entry来遍历集合中的元素
●下面我们来看看如何实现上面三种遍历方式
/** * * @author 毛麒添 * Map 集合的遍历 */ public class Demo { public static void main(String[] args) { Map<String ,Integer> map=new HashMap<String, Integer>(); map.put("张三", 18); map.put("李四", 19); map.put("王五", 20); map.put("赵六", 21); //使用迭代器进行遍历 /*Set<String> keySet = map.keySet();//获取所有key的集合 Iterator<String> iterator = keySet.iterator(); while(iterator.hasNext()){ String key = iterator.next(); Integer i=map.get(key); System.out.println(i); }*/ //使用增强For循环来进行遍历 for (String key :map.keySet()) { Integer integer = map.get(key); System.out.println(integer); } /*---------------------------使用Map.Entry来遍历集合中的元素--------------------------*/ Set<Map.Entry<String,Integer>> en=map.entrySet();////获取所有的键值对象的集合 /*//使用迭代器来遍历 Iterator<Entry<String, Integer>> iterator = en.iterator(); while(iterator.hasNext()){ Entry<String, Integer> e=iterator.next();//获取键值对对象 String key = e.getKey();//根据键值对对象获取键 Integer value = e.getValue();//根据键值对对象获取值 System.out.print(key); System.out.println(value); }*/ //使用增强for循环来遍历 for (Entry<String, Integer> entry : en) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.print(key); System.out.println(value); } /*---------------------------使用Map.Entry来遍历集合中的元素--------------------------*/ } } |
●LinkHashMap与LinkHashSet一样,怎么存怎么取,保证元素唯一(key 是唯一判定值),由于保证元素唯一,其性能肯定会低一些,这里就不细说了。
●TreeMap是双列集合,其实他和TreeSet是很像的,但是双列集合的键是唯一标识,所以TreeMap排序的是每个元素的键。对于存储自定义对象排序,它也有Comparable和Comparator,下面我们来看例子
/** * * @author 毛麒添 * TreeMap * 通TreeSet 原理,存取自定义对象也需要继承Comparable结构, * 或者实现比较器Comparator */ public class Demo6_TreeMap { public static void main(String[] args) { TreeMap<Student, String> tm=new TreeMap<Student, String>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num=s1.getName().compareTo(s2.getName());//以姓名作为主要比较条件 return num==0?s1.getAge()-s2.getAge():num; } }); tm.put(new Student("张三",13),"杭州"); tm.put(new Student("张三",14), "贺州"); tm.put(new Student("王五",15), "广州"); tm.put(new Student("赵六",16), "深圳"); System.out.println(tm); } } /** * 自定义对象 * @author 毛麒添 * HashMap 存储对象 与 HashSet 同理 需要重写 hashcode 和equals 方法 * TreeMap 实现 Comparable接口 */ public class Student implements Comparable<Student>{ private int age; private String name; public Student(){ super(); } public Student(String name,int age){ this.name=name; this.age=age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [age=" + age + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int compareTo(Student o) { int num =this.age-o.age;//以年龄为主要条件 return num==0?this.name.compareTo(o.name):num;//姓名作为次要条件 } } |
到这里,Java集合框架的复习基本完成,最后来一个斗地主的例子对集合框架做一个综合应用,只是实现斗地主洗牌和发牌,至于怎么打牌,逻辑复杂,这里不做实现。
/** * * @author 毛麒添 * 模拟斗地主洗牌和发牌,牌排序 * 买一副扑克 * 洗牌 * 发牌 * 看牌 */ public class Doudizhu_progress { public static void main(String[] args) { // TODO Auto-generated method stub //构造一副扑克牌 String[] number={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[]color={"黑桃","红桃","梅花","方块"}; HashMap<Integer, String> pokerMap=new HashMap<Integer, String>();//存放牌的map ArrayList<Integer> list=new ArrayList<Integer>();//存放牌的索引 int index=0; //索引 for (String s1 : number) { for (String s2 : color) { pokerMap.put(index,s2.concat(s1)); list.add(index); index++; } } //加入大小王 pokerMap.put(index,"小王"); list.add(index); index++; pokerMap.put(index,"大王"); list.add(index); //洗牌 Collections.shuffle(list); //System.out.println(list); //发牌,3个人玩 加上底牌3张 使用TreeSet 来存放索引,并自动对索引排好序 TreeSet<Integer> mao=new TreeSet<Integer>(); TreeSet<Integer> li=new TreeSet<Integer>(); TreeSet<Integer> huang=new TreeSet<Integer>(); TreeSet<Integer> dipai=new TreeSet<Integer>(); for(int i=0;i<list.size();i++){ if(i>=list.size()-3){//最后三张牌,作为底牌 dipai.add(list.get(i)); }else if(i%3==0){ mao.add(list.get(i)); }else if(i%3==1){ li.add(list.get(i)); }else { huang.add(list.get(i)); } } //看牌 lookPoker(pokerMap,mao,"mao"); lookPoker(pokerMap,li,"li"); lookPoker(pokerMap,huang,"huang"); lookPoker(pokerMap,dipai,"底牌"); } /** * 看牌的方法 * @param pokerMap 存放牌的map * @param mao 该玩家的牌的索引集合 * @param name 玩家名字 */ private static void lookPoker(HashMap<Integer, String> pokerMap, TreeSet<Integer> mao, String name) { if(name.equals("底牌")){ System.out.print("地主"+name+"的牌是:"); }else{ System.out.print("玩家"+name+"的牌是:"); } for (Integer integer : mao) { System.out.print(pokerMap.get(integer)+" "); } System.out.println(); } } |
运行截图:
斗地主程序运行截图.png
写在最后:
如果你看到这里,估计你也温故知新了吧,那就这样吧,这篇又臭又长的文章就到这里啦。文章中如果有错误,请大家给我提出来,大家一起学习进步,如果觉得我的文章给予你帮助,也请给我一个喜欢。