Java集合(四)

1. 简单练习HashSet集合-产生1到20,10个不重复的随机数
//1.创建Random对象
        Random r = new Random();
        //2.因为存储不重复的,我们用HashSet集合
        //这里泛型为什么用Integer知道吗!
        HashSet<Integer> hs = new HashSet<>();
        //3.循环条件hs.size()<10;
         while (hs.size() < 10){
             //4.通过Random方法获取随机数
             //r.nextInt(20):获取到的是0到19的随机数--左开右闭的
             hs.add(r.nextInt(20) + 1);
         }
        System.out.println(hs);
2. 集合小练习
#练习一:
//需求:使用Scanner输入,去掉输入中的重复字符,打印不同的字符
        //1.创建Scanner对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一串字符:");

        //2.创建hashSet对象
        HashSet<Character> hs = new HashSet<>();

        //3.用字符串接收这个输入值,并将字符串转为字符数组
        String str = sc.nextLine();
        char[] arr = str.toCharArray();

        //4.遍历字符数组并加入到hs中
        for (Character c :  arr){
            hs.add(c);
        }
        System.out.println(hs);

#练习二:
//需求:给有重复元素的ArrayList集合创建一个去重方法,直接调用就好
        ArrayList<String> list = new ArrayList<>();
        list.add("tmac");
        list.add("tmac");
        list.add("kobe");
        list.add("kobe");
        list.add("kg");
        list.add("kg");
        list.add("jiangjun");
        list.add("jiangjun");
        System.out.println(list);
        System.out.println("去重之前的值");

        //调用封装的去重方法
        cancelReptList(list);
        System.out.println(list);
        System.out.println("去重之后的值");
    }
    //封装的去重方法
    public static void cancelReptList(List<String> list){
        //1.创建LinkedHashSet对象,这里面不能存储重复值
        LinkedHashSet<String> hs = new LinkedHashSet<>();
        //2.将list加到hs中,就可以在hs中去除重复值了
        hs.addAll(list);
        //3.将list清空
        list.clear();
        //4.将去重后的hs加入到list中
        list.addAll(hs);
    }


3. TreeSet集合的简单使用
 //1.TreeSet集合是对元素进行排序且保证元素唯一的
        //只用LinkedHashSet是保证怎么存就怎么取,且去重的
        TreeSet<Integer> ts = new TreeSet<>();//从小到大排序
        ts.add(78);
        ts.add(45);
        ts.add(109);
        ts.add(23);
        ts.add(12);
        System.out.println(ts);

        //2.TreeSet集合存储自定义对象
        TreeSet<Student> ts1 = new TreeSet<>();
        ts1.add(new Student("tmac",23));
        ts1.add(new Student("kobe",13));
        ts1.add(new Student("king",34));
        ts1.add(new Student("jiangjun",45));
        //我们存储的是自定义对象,TreeSet是对元素排序的,我们看看会怎么回事
        System.out.println(ts1);
        //报错崩溃:java.lang.ClassCastException:类型无法匹配。我们解决方法是
        //实现一个compable接口,就是要告诉TreeSet按照什么要求对Student排序

//延展:
        //TreeSet底层是二叉树结构
4. Map集合的概述和特点和iOS的字典很像
 //1.创建一个map
        Map<String,Integer> map = new HashMap<>();
        //添加元素的方法put--put方法是有返回值的,返回值就是这个值的类型
      Integer i1 = map.put("tmac",19);
        map.put("kobe",37);
        map.put("kiii",98);
        map.put("kdjf",88);
      Integer i2 = map.put("tmac",39);
        System.out.println(map);//看这个打印发现键和值是对应的,但是打印出来顺序是无序的
        System.out.println(i1);
        System.out.println(i2);
        //对比i1和i2的打印值,说明我们呢put方法的返回值只返回被覆盖的键对应的值
        //在Map中键的值是唯一的,我们重复为一个键添加值,就会覆盖原有值,并返回

        System.out.println("1---------------------");
        //2.根据键删除值,返回被删除的值
       Integer i3 = map.remove("tmac");
        System.out.println(i3);

        map.put("jj",45);
        map.put("cc",44);
       //根据键和值删除,返回删除成功与否
        boolean b1 = map.remove("jj",45);
        System.out.println(b1);
        System.out.println("2------------------");
        //3.清除所有元素
       // map.clear();

        //4.判断功能
        //map.containsKey():是否包含这个key
        //map.containsValue():是否包含这个值
        map.isEmpty();//是否为空

        //5.获取集合中所有的值
       Collection<Integer> c =  map.values();
        System.out.println(c);

        //6.map.size():元素个数--一对键值才是一个长度

5. Map集合的遍历—键找值
 //1. Map集合遍历--键找值(map中没有迭代器)
        Map<String,Integer> map = new HashMap<>();
        map.put("jj",67);
        map.put("ji",45);
        map.put("qq",32);
        map.put("aa",13);
        map.put("cc",38);

        //根据键获取值
        //Integer i = map.get("jj");
       //第一种遍历方法
        //获取所有键的集合
        Set<String> keySet = map.keySet();//这个set集合中就有迭代器了

        Iterator<String> it = keySet.iterator();
        while (it.hasNext()){
            String str = it.next();
            Integer i1 =  map.get(str);
            System.out.println(i1);
        }
        System.out.println("-----------------------");
        //第二种 增强for循环遍历
        for (String str : map.keySet()){
            Integer i2 = map.get(str);
            System.out.println(i2);
 }

6. Map使用键值对对象找键和值
 //Map集合键值对对象找键和值
        Map<String,String> map = new HashMap<>();
        map.put("jj","maidi");
        map.put("qq","tmac");
        map.put("bb","kobe");
        map.put("vv","king");
        map.put("cc","polo");
        System.out.println(map);
        //获取键值对对象
        //Map.Entry说明Entry是Map的内部接口
        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        System.out.println(entrySet);//现在打印出来和这个map是一样的
        //利用迭代器来遍历entrySet
        Iterator<Map.Entry<String,String>> it = entrySet.iterator();
        while (it.hasNext()){
            //获得每一个entry对象
            Map.Entry<String,String> en = it.next();
            //获取key和值
            String key = en.getKey();
            String value = en.getValue();
            System.out.println(key);
            System.out.println(value);

        }
        System.out.println("下面是增强for循环的结果");
        //用增强for循环解决
        for (Map.Entry<String,String> en : entrySet){
            String key = en.getKey();
            String value = en.getValue();
            System.out.println(key);
            System.out.println(value);
        }
      
7. LinkedHashMap
 //LinkedHashMap
        LinkedHashMap<String,Integer> lhm = new LinkedHashMap<>();
        lhm.put("t",3);
        lhm.put("j",5);
        lhm.put("w",2);
        lhm.put("i",5);
        System.out.println(lhm);
        //打印出来发现是怎么存怎么取的
       
8.
 //TreeMap集合--第一种比较,重写自定义类的方法
        TreeMap<Student,String> tm = new TreeMap<>();
        tm.put(new Student("tmac",19),"成都");
        tm.put(new Student("tma",123),"上海");
        tm.put(new Student("tm",13),"北京");
        tm.put(new Student("t",18),"广州");
        System.out.println(tm);
        //在这里打印tm是会报错的,因为TreeMap会对这个键进行排序,现在
        //我们的键是自定义的学生对象,所以不知道怎么排序,所以我们要去在自定义类中
        //去实现这个Comparable接口
        //这样还是比较复杂的,我们有传比较器的构造方法
        System.out.println("1----------------------");
   
#自定义类中的操作
public class Student implements Comparable<Student> //实现接口
//重写接口中的方法
  //实现这个Comparable<Student>接口,告诉这个TreeMap怎么去比较这个Student
    @Override
    public int compareTo(Student s) {
        int num = this.age - s.age;
        return num == 0 ? this.name.compareTo(s.name) : num;
        //以比较年龄为主要条件,姓名为次要条件
    }

#第二种比较方法—传入匿名内部类
  //在我们创建这个tm1时,就传一个匿名内部类,并重写里面的方法
        TreeMap<Student,String> tm1 = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num = o1.getName().compareTo(o2.getName());//前面这个比较是按照码表值比较的(可以传入中文试试)
                 return num == 0 ? o1.getAge() - o2.getAge() : num;//首要按姓名排序,其次年龄
            }

        });
        tm1.put(new Student("蒋介石",19),"成都");
        tm1.put(new Student("曾国藩",89),"上海");
        tm1.put(new Student("易中天",13),"北京");
        tm1.put(new Student("邋遢大王",18),"广州");
        System.out.println(tm1);

9. 统计字符串中字符出现的次数
//小练习--统计字符串中字符出现的次数
        //1.定义一个字符串
        String str = "aaaaaahhhhhhhbbbbbbbddddddduuuuuuiiiiiiii";
        //2.将字符串转为字符数组
        char[] charr = str.toCharArray();
        //3.定义双列集合,存储字符串及字符串出现的次数
        HashMap<Character,Integer> hs = new HashMap<>();
        //4.遍历字符数组中所有字符,并将每个字符存入集合中
        for (char c : charr){
            //存储过程中要判断,如果集合中不包含这个key,就将键和值存入,且值为1.如果包含,就将值加1
//            if (!hs.containsKey(c)){
//                hs.put(c,1);
//            }else{
//               hs.put(c, hs.get(c) + 1);
//            }
             hs.put(c, hs.containsKey(c) ? hs.get(c) + 1 : 1 );
             //三目运算符:表达式? 结果1 : 结果2 (表达式为真,执行结果1,否则执行结果2)
 }
        System.out.println(hs);
 
10. HashMap嵌套HashMap
 //HashMap嵌套HashMap
        //定义一个班级
        HashMap<Student, String> hm88 = new HashMap<>();
        hm88.put(new Student("孙悟空", 23), "fd");
        hm88.put(new Student("泰森", 24), "dd");
        hm88.put(new Student("麦斯", 25), "dd");
        hm88.put(new Student("科比", 26), "fgd");

        //定义另一个班级
        HashMap<Student, String> hm99 = new HashMap<>();
        hm99.put(new Student("Ã∆…Æ", 1023), "±±æ©");
        hm99.put(new Student("ÀÔŒÚø’",1024), "±±æ©");
        hm99.put(new Student("÷Ì∞ÀΩ‰",1025), "…œ∫£");
        hm99.put(new Student("…≥∫Õ…–",1026), "π„÷›");

        //再定义一个HashMap来存,注意键--就是HashMap
        HashMap<HashMap<Student, String>, String> hm = new HashMap<>();
        hm.put(hm88, "µ⁄88∆⁄ª˘¥°∞‡");
        hm.put(hm99, "µ⁄99∆⁄ª˘¥°∞‡");

        //遍历
        for(HashMap<Student, String> h : hm.keySet()) {
            String value = hm.get(h);

            for(Student key : h.keySet()) {
                String value2 = h.get(key);

                System.out.println(key + "=" + value2 + "=" + value);
            }
        }

11. HashMap和Hashtable的简单区别
 //HashMap和Hashtable的区别
        /*共同点:底层都是hash算法,都是双列集合
        不同点:
        HashMap:是线程不安全的,效率高
        2.可以存储null键和null值
        Hashtable:是线程安全的,效率低
        2.不能存储null键和null值
        */

12. 集合框架Collections工具类简单使用
//集合框架Collections工具类
     /*
    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)
    */
     //1.排序
        ArrayList<String> list = new ArrayList<>();
        list.add("d");
        list.add("c");
        list.add("a");
        list.add("b");
        System.out.println(list);//ArrayList是怎么存怎么取的
        System.out.println("排序之后");
        //集合工具类Collections的类方法
        Collections.sort(list);
        System.out.println(list);
        System.out.println("1-------------------------");

     //2.二分查找法--根据值返回值在集合中的索引
        //我们用个有序的集合
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("a");
        list1.add("c");
        list1.add("e");
        list1.add("g");
        list1.add("k");
        list1.add("m");
        list1.add("y");
        int num = Collections.binarySearch(list1,"c");
        int num1 = Collections.binarySearch(list1,"k");
        System.out.println(num);
        System.out.println(num1);
        System.out.println("2------------------------------");

     //3. 获取最大值
        String str = Collections.max(list1);
        System.out.println(str);
        System.out.println("3-------------------------------");

    //4. 反转
      Collections.reverse(list1);
        System.out.println(list1);
        System.out.println("4--------------------------------");
    //5. 洗牌--打乱
        Collections.shuffle(list1);
        System.out.println(list1);

13. 斗地主随机发牌实现
//斗地主发牌小游戏
     //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){
                //拼接
               String s3 = s1.concat(s2);
               poker.add(s3);//一副扑克的基本骨架有了
            }
        }
        //System.out.println(poker);
        //添加大小王
        poker.add("小王");
        poker.add("大王");
        System.out.println(poker.size());

        //2.洗牌
        Collections.shuffle(poker);

        //3.发牌--我们需要三个集合当做三个玩家的牌,创建一个集合作为底牌的集合
        ArrayList<String> tmac = new ArrayList<>();
        ArrayList<String> kobe = new ArrayList<>();
        ArrayList<String> mine = new ArrayList<>();
        ArrayList<String> dipai = new ArrayList<>();
        //for循环发牌
        for (int i = 0; i < poker.size(); i++){
            //先添加底牌
            if (i >= poker.size() - 3){
                dipai.add(poker.get(i));
            }else if(i % 3 == 0){
               //i%3:这个好好想想--在剩余的51张牌中,有17个下标是可以将3整除的
                tmac.add(poker.get(i));
            }else if(i % 3 == 1){
                kobe.add(poker.get(i));
            }else{
                mine.add(poker.get(i));
            }
        }
        //4.看牌
        System.out.println(tmac);
        System.out.println(kobe);
        System.out.println(mine);
        System.out.println(dipai);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容