2019-05-27 Java学习日记之Map集合&模拟斗地主洗牌发牌

Map集合

Map集合的概述和特点:

A:概述

将键映射到值的对象

一个映射不能包含重复的键

每个 键最多只能映射到一个值

B:Map接口和Collection接口的不同

Map是双列的,Collection是单列的

Map的键唯一,Collection的子体系Set是唯一的

Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

Map集合的功能概述:

a:添加功能

  V put(K key,V value):添加元素

    如果键是第一次存储,就直接存储元素,返回null

    如果键不是第一次存储,就用值把以前的值替换掉,返回以前的值

b:删除功能

void clear():移除所有的键值对元素

V remove(Object key):根据键删除键值对元素,并把值返回

c:判断功能

boolean containsKey(Object key):判断集合是否包含指定的键

boolean containsValue(Object value):判断集合是否包含指定的值

boolean isEmpty():判断集合是否为空

d:获取功能

Set<Map.Entry<K,V>> entrySet():

V get(Object key):根据键获取值

Set<K> keySet():获取集合中所有键的集合

Collection<V> values():获取集合中所有值得集合

e:长度功能

int size():返回集合中的键值对的个数

Demo:

package com.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Demo1 {

    public static void main(String[] args) {
//        demo1();
//        demo2();
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 23);
        map.put("李四", 24);
        map.put("王五", 25);
        map.put("赵六", 26);
        
        Collection<Integer> c = map.values();
        System.out.println(c);
        System.out.println(map.size());
    }

    public static void demo2() {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 23);
        map.put("李四", 24);
        map.put("王五", 25);
        map.put("赵六", 26);
        
        //Integer value = map.remove("张三");                //根据键删除元素,返回键对应的值
        //System.out.println(value);
        System.out.println(map.containsKey("张三"));        //判断是否包含传入的键
        System.out.println(map.containsValue(100));        //判断是否包含传入的
        System.out.println(map);
    }

    public static void demo1() {
        Map<String, Integer> map = new HashMap<>();
        Integer i1 = map.put("张三", 23);
        Integer i2 = map.put("李四", 24);
        Integer i3 = map.put("王五", 25);
        Integer i4 = map.put("赵六", 26);
        Integer i5 = map.put("张三", 26);            //相同的键不存储,值覆盖,吧覆盖的值返回
        
        System.out.println(map);
        
        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);
        System.out.println(i5);
    }

}

Map集合的遍历之键找值:

A:键找值思路

获取所有键的集合

遍历键的集合,获取到每一个键

根据键找值

B:Demo

package com.map;

import java.util.HashMap;
import java.util.Map;

public class Demo2 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 23);
        map.put("李四", 24);
        map.put("王五", 25);
        map.put("赵六", 26);
        
        //Integer i = map.get("张三");        //根据键获取值
        //System.out.println(i);
        
        //获取所有的键
        /*Set<String> keySet = map.keySet();    //获取所有键的集合
        Iterator<String> it = keySet.iterator();    //获取迭代器
        while (it.hasNext()) {                //判断集合中是否有元素
            String key = it.next();            //获取每一个键
            Integer value = map.get(key);    //根据键获取值
            System.out.println(key + "=" +value);
        }*/
        
        //使用增强for循环遍历
        for (String key : map.keySet()) {        //map.keySet()是所有键的集合
            System.out.println(key + "=" + map.get(key));
        }
    }

}

 Map集合的遍历值键值对对象找键和值:

A:键值对对象找键和值思路

获取所有键值对对象的集合

遍历键值对对象的集合,获取到每一个键值对对象

根据键值对对象找键和值

B:Demo

package com.map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Demo3 {
    /**
     * Map集合的第二种迭代,根据键值对对象,获取键和值
     */
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 23);
        map.put("李四", 24);
        map.put("王五", 25);
        map.put("赵六", 26);

        // Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set中
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        //获取每一个对象
        /*Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();
        while (it.hasNext()) {
            //获取每一个Entry对象
            Map.Entry<String, Integer> en = it.next();
            String key = en.getKey();                    //根据键值对对象获取键
            Integer value = en.getValue();                //根据键值对对象获取值
            System.out.println(key + "=" + value);
        }*/
        
        for (Map.Entry<String, Integer> en : entrySet) {
            System.out.println(en.getKey() + "=" + en.getValue());
        }
        
    }
}

HashMap集合键是Student值是String的案例:

package com.map;

import java.util.HashMap;

import com.bean.Student;

public class Demo4 {
    /**
     * HashMap集合键是Student值是String的案例:
     * 键是学生对象,代表每一个学生
     * 值是字符串对象,代表学生归属地
     */
    public static void main(String[] args) {
        HashMap<Student,String> hm = new HashMap<>();
        hm.put(new Student("张三",23),"北京" );
        hm.put(new Student("李四",23),"上海" );
        hm.put(new Student("王五",25),"广州" );
        hm.put(new Student("赵六",26),"深圳" );
        
        System.out.println(hm);
    }

}

LinkedHashMap的概述和使用:

特点:

底层是链表实现的可以保证怎么存就怎么取

package com.map;

import java.util.LinkedHashMap;

public class Demo5 {

    public static void main(String[] args) {
        LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
        lhm.put("张三", 23);
        lhm.put("李四", 24);
        lhm.put("王五", 25);
        lhm.put("赵六", 26);
        
        System.out.println(lhm);
    }

}

TreeMap集合键是Student值是String的案例:

package com.map;

import java.util.Comparator;
import java.util.TreeMap;

import com.bean.Student;

public class Demo6 {

    public static void main(String[] args) {
        TreeMap<Student, String> tm = new TreeMap<>(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("张三",23),"北京" );
        tm.put(new Student("王五",35),"广州" );
        tm.put(new Student("李四",13),"上海" );
        tm.put(new Student("赵六",46),"深圳" );
        
        System.out.println(tm);
    }

}

统计字符串中每个字符出现的次数:

package com.test;

import java.util.HashMap;

public class Test1 {
    /**
     * 需求:统计字符串中每个字符出现的次数
     * 分析:
     * 1、定义一个需要被统计字符的字符串
     * 2、将字符串转换为字符数组
     * 3、定义双列集合,存储字符串中字符一级字符出现的次数
     * 4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
     * 5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
     * 6、打印双列集合获取字符出现的次数
     */
    public static void main(String[] args) {
        //1、定义一个需要被统计字符的字符串
        String s = "aaaaaabbbbbcccccccc";
        //2、将字符串转换为字符数组
        char[] arr = s.toCharArray();
        //3、定义双列集合,存储字符串中字符一级字符出现的次数
        HashMap<Character, Integer> hm = new HashMap<>();
        //4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
        for (char c : arr) {
            //5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
            /*if (!hm.containsKey(c)) {    //如果不包含这个键
                hm.put(c, 1);
            }else {
                hm.put(c, hm.get(c) + 1);
            }*/
            hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
        }
        //6、打印双列集合获取字符出现的次数
        for (Character key : hm.keySet()) {                //hm.keySet()代表所有键的集合
            System.out.println(key + "=" + hm.get(key));//hm.get(key)根据键获取值
        }
    }

}

HashMap和Hashtable的区别:

A:面试题

区别:

Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高

Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

B:Demo

package com.map;

import java.util.HashMap;
import java.util.Hashtable;

public class Demo7 {
    public static void main(String[] args) {
        
        HashMap<String, Integer> hm = new HashMap<>();
        hm.put(null, 23);
        hm.put("张三", null);
        System.out.println(hm);
        
        Hashtable<String, Integer> ht = new Hashtable<>();
        ht.put(null, 23);
        ht.put("张三", null);
        System.out.println(ht);
    }
}

    Collection工具类的概述和常见方法:

A:概述

针对集合操作的工具类

B:成员方法

public static <T> void sort(List<T> list)

public static <T> int binarySearch(List<?> list,T key)

public static <T> T max(Collection<?> coll)  

public static void reverse(List<?> list)

public static void shuffle(List<?> list)

C:Demo

package com.collection;

import java.util.ArrayList;
import java.util.Collections;

public class Demo1 {

    public static void main(String[] args) {
//        demo1();
//        demo2();
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("c");
        list.add("h");
        list.add("f");
        list.add("g");
        System.out.println(Collections.max(list));        //根据默认排序结果获取集合中的最大值
//        Collections.reverse(list);                        //反转集合
        Collections.shuffle(list);                        //随机置换,可以用来洗牌    
        System.out.println(list);                         
    }

    public static void demo2() {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("c");
        list.add("d");
        list.add("f");
        list.add("g");
        
        System.out.println(Collections.binarySearch(list, "c"));
        System.out.println(Collections.binarySearch(list, "b"));
    }

    public static void demo1() {
        ArrayList<String> list = new ArrayList<>();
        list.add("c");
        list.add("d");
        list.add("a");
        list.add("c");
        list.add("b");
        list.add("c");
        
        System.out.println(list);
        Collections.sort(list);     //将集合排序
        System.out.println(list);
    }

}

模拟斗地主洗牌和发牌

模拟斗地主洗牌和发牌,牌没有排序:

package com.test;

import java.util.ArrayList;
import java.util.Collections;

public class Test2 {
    /**
     * 模拟斗地主洗牌和发牌,牌没有排序
     * 
     * 分析:
     * 1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
     * 2、洗牌
     * 3、发牌
     * 4、看牌
     */
    public static void main(String[] args) {
        //1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
        String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        String[] color = {"红桃","黑桃","方块","梅花"};
        ArrayList<String> poker = new ArrayList<>();
        
        //拼接花色和数字
        for (String s1 : color) {
            for (String s2 : num) {
                poker.add(s1.concat(s2));         //concat连接两个字符串
            }
        }
        poker.add("小王");
        poker.add("大王");
        //2、洗牌
        Collections.shuffle(poker);
        //3、发牌
        ArrayList<String> tan = new ArrayList<>();
        ArrayList<String> zhou = new ArrayList<>();
        ArrayList<String> chen = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        
        for (int i = 0; i < poker.size(); i++) {
            if (i >= poker.size() - 3) {
                dipai.add(poker.get(i));         //将三张底牌存储在底牌集合中
            }else if (i % 3 == 0) {
                tan.add(poker.get(i));
            }else if (i % 3 == 1) {
                zhou.add(poker.get(i));
            }else {
                chen.add(poker.get(i));
            }
        }
        //4、看牌
        System.out.println(tan);
        System.out.println(zhou);
        System.out.println(chen);
        System.out.println(dipai);
    }

}

模拟斗地主洗牌和发牌并对牌进行排序:

package com.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class Test3 {
    /**
     * 模拟斗地主洗牌和发牌,牌没有排序
     * 
     * 分析:
     * 1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
     * 2、洗牌
     * 3、发牌
     * 4、看牌
     */
    public static void main(String[] args) {
        //1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
        String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] color = {"方块","梅花","红桃","黑桃"};
        HashMap<Integer, String> hm = new HashMap<>();            //存储索引和扑克牌
        ArrayList<Integer> list = new ArrayList<>();            //存储索引
        int index = 0;
        
        //拼接扑克牌并索引和扑克牌存储在hm中
        for (String s1 : num) {                                    //获取数字    
            for (String s2 : color) {                            //获取颜色
                hm.put(index, s2.concat(s1));
                list.add(index);    
                index++;            
            }
        }
        //将小王添加到双列集合中
        hm.put(index, "小王");
        list.add(index);                                        //将52索引添加到集合中
        index++;
        hm.put(index, "大王");
        list.add(index);                                        //将53索引添加到集合中
        
        //2、洗牌
        Collections.shuffle(list);
        //3、发牌
        TreeSet<Integer> tan = new TreeSet<>();
        TreeSet<Integer> zhou = new TreeSet<>();
        TreeSet<Integer> chen = new TreeSet<>();
        TreeSet<Integer> dipai = new TreeSet<>();
        
        for (int i = 0; i < list.size(); i++) {
            if (i >= list.size() - 3) {
                dipai.add(list.get(i));         //将三张底牌存储在底牌集合中
            }else if (i % 3 == 0) {
                tan.add(list.get(i));
            }else if (i % 3 == 1) {
                zhou.add(list.get(i));
            }else {
                chen.add(list.get(i));
            }
        }
        //4、看牌
        lookPoker(hm, tan, "谭");
        lookPoker(hm, zhou, "周");
        lookPoker(hm, chen, "陈");
        lookPoker(hm, dipai, "底牌");
        
    }
    /**
     * 看牌
     * 分析:
     * 1、返回值类型void
     * 2、参数列表HashMap,TreeSet,String name
     */
    public static void lookPoker(HashMap<Integer, String> hm,TreeSet<Integer> ts , String name){
        System.out.print(name + "的牌是:");
        for (Integer i : ts) {        //i代表双列集合中的每一个键
            System.out.print(hm.get(i) + " ");
        }
        System.out.println();
    }
}

泛型固定下边界:

package com.collection;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;

import com.bean.BaseStudent;
import com.bean.Student;

public class Demo2 {
    /**
     * 泛型固定下边界
     * ? super E
     * 
     * 泛型固定上边界
     * ? extends E
     */
    public static void main(String[] args) {
//        demo1();
        TreeSet<Student> ts1 = new TreeSet<>(new CompareByAge());
        ts1.add(new Student("张三",32));
        ts1.add(new Student("李四",12));
        ts1.add(new Student("王五",42));
        ts1.add(new Student("赵六",22));
        
        TreeSet<BaseStudent> ts2 = new TreeSet<>(new CompareByAge());
        ts2.add(new BaseStudent("张三",32));
        ts2.add(new BaseStudent("李四",12));
        ts2.add(new BaseStudent("王五",42));
        ts2.add(new BaseStudent("赵六",22));
        
        System.out.println(ts2);
    }

    public static void demo1() {
        ArrayList<Student> list1 = new ArrayList<>();
        list1.add(new Student("张三",23));
        list1.add(new Student("李四",24));
    
        ArrayList<BaseStudent> list2 = new ArrayList<>();
        list2.add(new BaseStudent("王五",25));
        list2.add(new BaseStudent("赵六",26));
        
        list1.addAll(list2);
    }

}
class CompareByAge implements Comparator<Student> {

    @Override
    public int compare(Student s1, Student s2) {
        int num = s1.getAge() - s2.getAge();
        return num == 0 ? s1.getName().compareTo(s2.getName()) : num;
    }
    
}

Student.java

package com.bean;

import javax.swing.plaf.nimbus.NimbusLookAndFeel;

public class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
        super();
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    @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;
    }
    
}

BaseStudent.java

package com.bean;

public class BaseStudent extends Student {

    public BaseStudent() {
    }

    public BaseStudent(String name, int age) {
        super(name, age);
    }

}

 

原文地址:https://www.cnblogs.com/clqbolg/p/10934911.html