⚔疯狂输出⚔ collection中的Set方法

来源:互联网 发布:c 数字图像处理算法 编辑:程序博客网 时间:2024/05/20 05:55

Set集合的特点 无序 无下标 无重复 元素

创建一个HashSet 保存两个A 两个B 两个C
这三个值是怎么存的 怎么取出来

public  static void main(String[]agrs){//使用HashSet声明4一个对象HashSet<String> hashSet = new HashSet()<>;hashSet.add("A");hashSet.add("A");hashSet.add("B");hashSet.add("B");hashSet.add("C");hashSet.add("C");//使用增强for循环遍历数组for(String sting : hashSet){System.outprintln(String);}}

创建一个HastSet 保存这六个元素并且给这个集合遍历
比较两个元素的哈希值,如何两个元素Hash值相同的话
系统会默认帮我们调用equals方法 去比较两个元素是否一样
如果一样 就不存储 删掉重复的相同的那个元素 (这里会调用equals方法判断是不是相同的元素)
如果一样 就存储 保存到Set集合当中 (Hash不同的时候 系统会认为他是两个不同的元素 就不会调用equals方法)

所以要注意了 : 在保存的时候 先看Hash值 如果Hash值相同 就不会调用equals方法了

如果要是想减少调用equals方法 那就要重写 HashCode()方法和equals方法
下面我们换个题目来重写一下
题目:创建一个HashSet 保存五个人的名字年龄并遍历 ,认为年龄和姓名就是同一个人去掉重复的。
//先写一个人的类出来里面有名字 年龄

public Person{private String name;pricate int age;//无参的构造方法public void Person(){}//有参的构造方法public int Person(String name,int age){ this.name= name; this.age = age;}set/get方法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;}toString方法public String toString() {    return "Person [name=" + name + ", age=" + age + "]";}//下面我们就要重写HashCode方法public int hashCode() {    final int prime = 31;    int result = 1;    result = prime * result + age;    result = prime * result + ((name == null) ? 0 : name.hashCode());    return result;}    //写这么复杂就是为了让hashCode减少重复    //少调用equals方法 提高了存储的效率。    //为什么使用31    //1.31是个质数  能被1和本身整数  减少公约数    //2.31这个数  不大也不小 下面我们重写equals方法public boolean equals(Object obj) {    //防御式判断   健壮性判断    if (this == obj)  //两个对象的地址        return true;  //说明是一个对象    if (obj == null)  //有一个对象是空的        return false; //两个对象不相同    //判断两个对象是不是用同一个类  创建出来的    if (getClass() != obj.getClass())        return false;  //认为不是一个对象    Person other = (Person) 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;   //前面都没走就说 和这个两个对象是两个相同的对象}
public  static  void main(String[]agrs){HashSet<Person> hashSet = new HashSet()<>;hashSet.add(new Person("小明"19));hashSet.add(new Person("小王"19));hashSet.add(new Person("小张"19));hashSet.add(new Person("小红"19));hashSet.add(new Person("小紫"19));//使用增强for循环遍历for(Person person:hashSet){}System.out.println(hashSet);}

上面是hashSet方法的是如何存取元素的、以及hashSet的作用
下面我们来看下
LinkedHashSet 特点:通过它排序出来的元素是有序的
下面我们写一个简单的小程序
创建一个HashSet 保存两个A 两个B 两个C
看他是如何存取的
他继承HashSet所有的方法

public static  void mian (String[]agrs){LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add("A");linkedHashSet.add("A");linkedHashSet.add("B");linkedHashSet.add("B");linkedHashSet.add("C");linkedHashSet.add("C");System.out.println(linkedHashSet);}

我们写几个练习来巩固一下今天所学习的知识
题目1.编写一个程序 获取10个1-20的随机数,要求不能重复

//思路//去重-->往Set集合上琢磨//去创建一个Set集合//随机10个数//把10个数  添加到集合中 integer  character//当集合长度<10添加>=10 就不添加LinkedHashSet<>linkedHashSet  = new LinkedHashSet<>();for(i= 0;i<11;i++){int num =(int)(Math.random()*(20-1+1)+1)}linkedHashSet.add(num)//自动装箱System.out.println(n);

//输入一个字符串 去掉其中重复的字符,打印出不同的那些字符
//用LinkedHashSet 编写一段程序
//键盘中输入一个字符串
//获取字符串里字符的值
//去掉重复的值
//打印去重后的值

LinkedHashSet<Character>linkedHashSet = new linkedHashSet<>();Scanner scanner  =  new Scanner(system.in);String  string = scanner.next.Line();for(i =0 ;i<string.length;i++){LinkedHashSet.add(string.CharAt(i));}System.out.println(LinkedHashSet);

用set方法接收一个字符串然后去重打印去重后的值

//编写Set集合//把接收过来的字符串  转成 字符数组//遍历这个字符数组 把每一个字符 存入Set中//打印set集合System.out.println("请输入一串字符");Scanner scanner = new Scanner(System.in);String string = scanner.nextLine();char[] charArray = string.toCharArray();HashSet<Character> set = new HashSet<>();for (int i = 0; i < charArray.length; i++) {set.add(charArray[i]);}System.out.println(set);

利用set集合 去除ArrayList集合中的重复元素(操作原ArrayList)

ArrayList<String> arraylist = new ArrayList<>();arraylist.add("s");arraylist.add("a");arraylist.add("d");arraylist.add("w");arraylist.add("t");//为了保存原来的顺序所以选取LinkedHashSetLinkedHashSet<> linkedHashSet  = new LinkedHashSet<>();//把arraylist中所有的元素加载到linkedHashSet中 去掉重复的linkedHashSet.addALL(arraylist);linkedHashSet.clear();linkedHashSet.addAll(linkedHashSet);System.out.println(arraylist);

TreeSet
特点:排序 去重
比较器

TreeSet<String>set = new TreeSet<>(new Comparatorimpl()){        });        set.add("sd");        set.add("sdflk");        set.add("sdqeg");        set.add("sdsd");        set.add("sadt");        set.add("sds");        set.add("s");        for (String string : set) {            System.out.println(string);        }

比较重写 接口中的compare方法

public class Comparatorimpl implements Comparator<String> {      //主要按照字符串长度比较     //次要按字符比较    //比较器相当于TreeSet的存储规则    @Override    public int compare(String o1, String o2) {    int length  = o1.length()-o2.length();    int num = length == 0 ?o1.compareTo(o2):length;    //如果字符串长度和字符都相同也需要把字符串都存进去    //所以返回正数(1) 或 负数 (-1) (不返回0就可以)        return num ==0 ? 1:num;    }}

在一个集合中存储了无序并且重复的字符串,
要求排序,而且还不能去除重复(用比较器)

ArrayList<String> arrayList  = new ArrayList<>();        arrayList.add("dasd");        arrayList.add("daadadasd");        arrayList.add("asdasdasdasdsdasd");        arrayList.add("daadadjasd");        arrayList.add("asdasdassdasdasd");        arrayList.add("daadajjjdasd");        arrayList.add("adasdasdasdasd");            arrayList.add("dadasd");        arrayList.add("asdaasdasdasdasd");        TreeSet<String> Set = new TreeSet<>(new Comparatorimpl());        //把arrayList塞进SetSet.addAll(arrayList);        //清空arrayList           arrayList.clear();        //再把Set塞进arrayList里面        arrayList.addAll(Set);        for (String string : arrayList) {        System.out.println(string);

比较器

public class Comparatorimpl implements Comparator<String> {      //主要按照字符串长度比较     //次要按字符比较    //比较器相当于TreeSet的存储规则    @Override    public int compare(String o1, String o2) {    int length  = o1.length()-o2.length();    int num = length == 0 ?o1.compareTo(o2):length;    //如果字符串长度和字符都相同也需要把字符串都存进去    //所以返回正数(1) 或 负数 (-1) (不返回0就可以)        return num ==0 ? 1:num;    }}

接收一个字符串,程序对其中所有字符进行排序
要求保留重复的

//从键盘输入一个值System.out.println("请输入一个字符串");Scanner  scanner   = new Scanner.(system.in);String string = scanner.nextline();//将接收的字符串转化为字符数组