集合-java(2)

set集合

set集合 里面不包含重复的元素 ,set集合 对迭代顺序不保证 所以普通for循环不能满足他

set输出的 东西是无序的

默认不会添加重复的元素

package 集合2;

import java.util.HashSet;

public class Set集合 {
    public static void main(String[] args) {
        HashSet<String> str = new HashSet<>();
        str.add("java");
        str.add("php");
        str.add("js");
        str.add("js2");
        str.add("js4");
        str.add("js");
        for(String item:str){
            System.out.println(item);
        }
    }
}

哈希值

不同字符串 会出现 不同的哈希值

通过哈希方法的重写 我们可以实现 不同的字符串 相同的哈希值

哈希set集合

它实现的set集合的接口

迭代的顺序不保证

哈希set集合 是由哈希表实现的,哈希set 集合 里面不能重复的元素

哈希set集合元素唯一的源码分析

1.add() 方法 里面 调用 一些列 方法 然后 调用元素的hashCode方法

2.然后看哈希表 哈希表未初始化 就对其初始化

3.根据对象的hash值计算存储位置 如果空 就存储 不空 就比较他的哈希值

4.如果哈希不同 就存储

5.如果哈希相同  就比较对象的 equlas()  方法  

 常见的链式哈希表

 哈希标的数组  长度默认是16  他是链条式的 存储  再原位置上 先比较 哈希值 再比较 对象的equals方法    

再数组中的位置 是通过 哈希值 %16 得到的数 去找数组中对应的位置

常见的LinkedhashSet()

这个哈希链表 是由链表式的 组成的 可以让元素 保证 有序输出 或者有序存储

哈希表 也会保证元素的唯一  也就是说没有重复的元素

treeSet 集合

 根据元素自然排序  这里的排序不是指 存储 和 去除的排序 而是指的是 会按着规则排序 具体的排序方法 是根据构造方法来的

无参构造根据元素自然排序

有参 根据指定的比较器进行排序

重点 这个集合没有带索引 所以不可以使用普通for循环遍历 

由于是 set集合,所以不包含重复的集合

package 集合2;

import java.util.TreeSet;

public class Treeset集合 {
    public static void main(String[] args) {
        TreeSet<String> str = new TreeSet<>();
        str.add("1");
        str.add("2");
        str.add("你好");
        str.add("你好");
        str.add("4");
        str.add("5");
        System.out.println(str);

        //treeset集合 是根据元素的分类 完成存储的
        //是跟句  数字  字母  还是汉字 完成分类的元素排序
    }
}

 自然排序   按照 1-n 从小到大的排序的方法排序  

记住 集合里面 我们存储的是引用类型  如果 

我们想存基本类型 我们就需要存储 int 的包装类  interger包装类

自然排序规则

//treeset集合 是根据元素的分类 完成存储的
//是跟句  数字  字母  还是汉字 完成分类的元素排序

数字排序 是根据 先分类型   再按着 类型的 大小进行排序  

比如 数字类型  1-100  慢慢排序

TreeSet集合存储 学生对象

package 集合2;


import java.util.TreeSet;

public class Treeset集合存学生对象 {
    public static void main(String[] args) {


        TreeSet<Student> strs = new TreeSet<Student>();

        Student stu1= new Student("卢贝", 20);
        Student stu2= new Student("魏长瑞", 20);
        Student stu3= new Student("唐三", 20);
        Student stu4= new Student("小舞", 20);

        strs.add(stu1);
        strs.add(stu2);
        strs.add(stu3);
        strs.add(stu4);

        for(Student stu:strs){
            System.out.println(stu);
        }
    }
}

对象再 treeset集合里面 Comparable 比较器 自然排序是无法 排序的

  • 该接口对实现它的每个类的对象强加一个整体排序。 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法

  • 也就是说  那个类想自然排序 就要 让该类 实现 这个自然排序的接口

  • 一类的自然排序C被说成是与equals一致 ,当且仅当e1.compareTo(e2) == 0具有相同的布尔值e1.equals(e2)  0返回的就是 相同的元素

  • package 集合2;
    
    import java.util.Objects;
    
    public class Student implements Comparable<Student>{
        String name;
        int age;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Student() {
        }
    
        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 boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof Student)) return false;
            Student student = (Student) o;
            return age == student.age && Objects.equals(name, student.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        @Override
        public int compareTo(Student o) {
    
            return this.age - o.age;
        }
    }

    最后重写的 comparTo 方法 按照的是 年龄 重新 写入的  所以他的自然排序是按照 年龄 排序的   这个方法返回值 是 0 认为他俩相同  返回值 为正数 认为 不是重复的 排序正序 小于0 的 是倒叙      可以用年龄相减的插值  比较  

  • o.age 就是 之前有的对象  this 就是之后进来的新对象

  • 主要条件  次要条件 一次排序 

 比较器排序 可以 让 类去实现那个 compater 接口 或者 再创建 treeset集合 的时候直接 创建

一个设置一个比较规则 做返回 

哈希set集合最终不会排序  Treeset集合会自动排序 自然排序

泛型 的好处

1.再存储数据的时候一般数据都是 object 类型 

2.有时候 String 存进去可以  interger 不可以 

3.泛型的好处 把运行时代码错误 提前

4.可以默认帮你转换数据类型 

泛型类 的使用 

设置 泛型  给一个类 自动的定义泛型 ()根据使用的泛型  当作参数传递  

泛型 常用的 类型  T V K E   都是一般代表泛型

泛型方法

1.泛型 一般通常指 一类  很多 

2.泛型 可以使用在类上 ,也可以使用在方法上  

 这个类型通配符 只可以匹配任何的类型 但是无法向里面存储元素

多个参数的传入

可变参数

package 集合2;

public class 可变参数 {
    public static void main(String[] args) {
        //可变参数  写法 类型... 名字  如果有 多余的参数 写在最前面 可变的参数放在最后面
        System.out.println(show(2, 3));
        System.out.println(duoge(1, 2, 33));
    }

    public static int show(int a, int b) {
        return a + b;
    }

    public static int duoge(int... a) {
        //System.out.println(a);
        //return a;
        int sum = 0;
        for (int item : a) {
            sum += item;
        }
        return sum;
    }
}

 可变参数 要在最后面

Array    List   set  这三个集合 都有一个静态的方法 集合.of() 方法   这个方法生成的集合 不允许改变  方法不管用不能进行追加元素 添加元素

Array 的可以 修改 操作  增加删除操作 不可以 

map集合的遍历方式

package Map集合3;

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

public class map集合的创建 {
    public static void main(String[] args) {
        Map<String, String> objectObjectMap = new HashMap<>();
        objectObjectMap.put("1001","魏长瑞");
        objectObjectMap.put("1002","卢贝");
        objectObjectMap.put("1003","唐三");
//        System.out.println(objectObjectMap);
        //map 集合像是个对象  key value 结构的  一个键对应一个值
        //当 键重复的时候 就会变成了 重新赋值

        //常用的方法
        /*
        * put 方法 增加
        * remove 方法 删除
        * clear 方法 清除
        * isEmpty 方法 判断是否为空
        * containsKey 方法 是否有这个key
        * containsvalue   是否有这个值
        *
        * */
        System.out.println(objectObjectMap.isEmpty());
        objectObjectMap.remove("1003");
        System.out.println(objectObjectMap);
        System.out.println(objectObjectMap.containsKey("1001"));
        System.out.println(objectObjectMap.size());
        Set<String> strings = objectObjectMap.keySet();
        for (String str:strings){
           System.out.println(str);

           System.out.println(objectObjectMap.get(str));
        }
        /*
        * 用 map集合的KeySet()集合方法获取 所有key的方法 通过增强for
        * 循环 循环出每个key  通过 .getKey()获取对应的值
        * */

        //方法2  遍历 enetrSet集合 获取每一个成对的 键值对

        Set<Map.Entry<String, String>> entries = objectObjectMap.entrySet();
        for (Map.Entry<String, String> str:entries){
            System.out.println(str.getValue());

        }
    }

}

 1.根据key 取值    2. 用enterSet集合获取整个键值对 对应的.getkey或者value 方法直接获取值 类型 就是泛型  

        

key是 object  值是 String 类型的 map 对象 存储 让key 保持唯一 

需要重写  对象的 

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

上面的两个 方法

package Map集合3;

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

public class 对象map存放测试 {
    public static void main(String[] args) {
        HashMap<Object,String> objectObjectHashMap = new HashMap<>();

        //创建对象
        Student student = new Student("卢贝",22);
        Student student1 = new Student("魏长瑞",22);
        Student student2 = new Student("魏长瑞",22);
//        objectObjectHashMap.put("1001",student);
//        objectObjectHashMap.put("1002",student);
//
//        System.out.println(objectObjectHashMap);
//        Set<Map.Entry<String, Object>> entries = objectObjectHashMap.entrySet();
//        for (Map.Entry<String, Object> item:entries){
//            System.out.println( item.getKey());
//            System.out.println(item.getValue());
//        }
        objectObjectHashMap.put(student,"遥墙");
        objectObjectHashMap.put(student1,"商河");
        objectObjectHashMap.put(student2,"商河");

        System.out.println(objectObjectHashMap);

    }
}

取值方法

package Map集合3;

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

public class map集合存储嵌套 {
    public static void main(String[] args) {

        //map集合的嵌套
        //创建一个 Arraylist 信息是 key value结构的

        ArrayList<Map<String,String>> objects = new ArrayList<>();
        HashMap<String, String> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("卢贝","魏长瑞");
        objectObjectHashMap.put("唐三","小舞");
        objects.add(objectObjectHashMap);
        HashMap<String, String> objectObjectHashMap1 = new HashMap<>();
        objectObjectHashMap1.put("1001","唐三");
        objectObjectHashMap1.put("1002","小舞");
        objects.add(objectObjectHashMap1);

        System.out.println(objects);

        for (Map<String,String> item:objects){
            System.out.println(item);
            Set<Map.Entry<String, String>> entries = item.entrySet();
            for (Map.Entry<String, String> str:entries){
                System.out.println(str.getKey());
                System.out.println(str.getValue());
            }

        }

        //Arraylist   存储  map集合======================================================================


        //map 集合 存储  list集合嵌套 ==========================================================================

        HashMap<String, ArrayList<String>> objectObjectHashMap2 = new HashMap<>();

        ArrayList<String> sgyy = new ArrayList<>();
        sgyy.add("诸葛亮");
        sgyy.add("赵云");
        objectObjectHashMap2.put("三国演义",sgyy);
        ArrayList<String> shz = new ArrayList<>();
        shz.add("林冲");
        shz.add("鲁智深");
        objectObjectHashMap2.put("水浒传",shz);

        System.out.println(objectObjectHashMap2);
        //  entrySet();  集合取值方法===============================================================
        Set<Map.Entry<String, ArrayList<String>>> entries = objectObjectHashMap2.entrySet();
        for (Map.Entry<String, ArrayList<String>> item:entries){
            System.out.println(item);

            for (int i = 0; i < item.getValue().size(); i++) {
                System.out.println(item.getValue().get(i));
            }
        }
        // keySet(); 取值 方法===========================================================================
        Set<String> strings = objectObjectHashMap2.keySet();
        for (String str:strings){
            System.out.println(str);
            ArrayList<String> strings1 = objectObjectHashMap2.get(str);
            for (String item:strings1){
                System.out.println("\t"+item);
            }
        }

    }
}

随机输入一个字符串 用 map集合 来收入 每个字符出现了多少次

package Map集合3;

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class 字符多少个的测试 {
    public static void main(String[] args) {
        HashMap<Character, Integer> objectObjectHashMap = new HashMap<>();//创建map集合
        Scanner scanner = new Scanner(System.in);//创建接收器
        String s = scanner.nextLine();//接收字符串

        System.out.println(s);//输出字符串
        System.out.println(s.length());//字符串的长度

        for (int i = 0;i <s.length(); i++) {//循环字符
            System.out.println(s.charAt(i));//输出字符
            if(!objectObjectHashMap.containsKey(s.charAt(i))){//如果没有在map集合里面找到 就 增加一个 否则找到了 就让找到的加1
                objectObjectHashMap.put(s.charAt(i),1);
            }else {
                System.out.println(objectObjectHashMap.get(s.charAt(i)));
                Integer integer = objectObjectHashMap.get(s.charAt(i));
                integer++;
                objectObjectHashMap.put(s.charAt(i),integer);
            }
        }
        System.out.println(objectObjectHashMap);
    }
}

1.map集合的使用

1.用户输入字符串 自动判断 字符出现的次数

package Map集合3;
​
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
​
public class 字符多少个的测试 {
    public static void main(String[] args) {
        HashMap<Character, Integer> objectObjectHashMap = new HashMap<>();//创建map集合
        Scanner scanner = new Scanner(System.in);//创建接收器
        String s = scanner.nextLine();//接收字符串
​
        System.out.println(s);//输出字符串
        System.out.println(s.length());//字符串的长度
​
        for (int i = 0;i <s.length(); i++) {//循环字符
            System.out.println(s.charAt(i));//输出字符
            if(!objectObjectHashMap.containsKey(s.charAt(i))){//如果没有在map集合里面找到 就 增加一个 否则找到了 就让找到的加1
                objectObjectHashMap.put(s.charAt(i),1);
            }else {
                System.out.println(objectObjectHashMap.get(s.charAt(i)));
                Integer integer = objectObjectHashMap.get(s.charAt(i));
                integer++;
                objectObjectHashMap.put(s.charAt(i),integer);
            }
        }
        System.out.println(objectObjectHashMap);
​
        //输出的不是按着顺序来的  如果需要按着顺序 可以 使用 TreeMap  树形的都是自动排序的
    }
}

2.treemap 类的集合 大部分都是自动自然排序的

2.Collections集合的常用静态方法

Collections.reverse(integers); 数组反转

等等 这种集合的常用方法

3.用list集合 存储对象 利用comaprbel 自然比较器排序

package Map集合3;
​
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
​
public class collection集合常用 {
    public static void main(String[] args) {
        ArrayList<Student> integers = new ArrayList<>();
//        integers.add(22);
//        integers.add(21);
//        integers.add(20);
//        integers.add(19);
//        integers.add(2);
        Student student = new Student("卢贝", 22);
        Student student1 = new Student("魏长瑞", 20);
        Student student2 = new Student("唐三", 20);
        integers.add(student);
        integers.add(student1);
        integers.add(student2);
        Collections.sort(integers);
        System.out.println(integers);
//        Collections.sort();
    }
}
//Tree set   Treemap都有比较器 
// list集合 使用  Collections 的sort方法 比较排序
​
//Collections.sort(integers); 但是需要学生类 实现 Comparable 接口 泛型是学生类的
​
package Map集合3;
​
import java.util.Objects;
​
public class Student implements Comparable<Student>{
    String name;
    int age;
​
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public Student() {
    }
​
    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 boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
​
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
​
    @Override
    public int compareTo(Student o) {
        int i = this.age - o.age;
        int i1 = i == 0 ? this.name.compareTo(o.name) : i;
        return i1;
    }
}

​模拟斗地主

package 模拟斗地主;

import java.util.*;

public class 模拟斗地主升级版本 {
    public static void main(String[] args) {
        //定义花色
        String[] hs = {"♠", "♦", "♥", "♣"};
        //定义纸牌的数
        String[] zp = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        HashMap<Integer,String> poker1 = new HashMap<Integer,String>();
        ArrayList<Integer> suoyin = new ArrayList<>();
        int index =0;
        for (int i = 0; i < zp.length; i++) {
            for (int j = 0; j < hs.length; j++) {
                poker1.put(index,hs[j]+zp[i]);
                suoyin.add(index);
                index++;
            }
        }
        poker1.put(52,"小王");
        suoyin.add(52);
        poker1.put(53,"大王");
        suoyin.add(53);

        Collections.shuffle(suoyin);
        TreeSet<Integer> play1 = new TreeSet<>();
        TreeSet<Integer> play2 = new TreeSet<>();
        TreeSet<Integer> play3 = new TreeSet<>();
        TreeSet<Integer> dp = new TreeSet<>();
        for (int i = 0; i < suoyin.size(); i++) {
            if(i>=suoyin.size()-3){
                dp.add(suoyin.get(i));
            }else if(i%3==0){
                play1.add(suoyin.get(i));
            }else if(i%3==1){
                play2.add(suoyin.get(i));
            }else if(i%3==2){
                play3.add(suoyin.get(i));
            }
        }

        System.out.println(play1);
        System.out.println(play2);
        System.out.println(play3);
        System.out.println(dp);


        //看牌的方法
        look("play1",play1, (HashMap<Integer, String>) poker1);
        look("play2",play2, (HashMap<Integer, String>) poker1);
        look("play3",play3, (HashMap<Integer, String>) poker1);

    }

    public static void look(String name,TreeSet<Integer> play,HashMap<Integer,String> poker){
        String s = play.toString();
        String sum="";
        for (int i:play){
            sum+=poker.get(i);

        }
        System.out.println(name+"\t"+sum);
    }
}

我们要求是 想让 它 数字从小到大排序   按照数字  

在我们生成 扑克牌的时候 假如是 先花色 外循环  数字内循环 

是 ===>黑桃3 黑桃 4  黑桃 5 .....这样的生成的

我们的treeset集合 是排序的 key的值   对应上面的  0 1 2 下标  

如果是  数字在外循环   花色在内循环 ===> 3黑桃 3 红桃 3方块  3 梅花  

我们的treeset集合 是key的排序  对应上面的  是0,1,2,3  这样 就是 都是 数字排序了

treeset  集合 把 我们的下标 进行了排序 所以 它出来的就是 按着数字排序 挨着的 一组扑克牌 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值