Day 21 集合框架(3)

集合框架(3)

Set子接口

特点:无序、无下标、元素不可重复。

方法:全部继承自Collection中的方法。

package United;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

//测试Set接口的使用
public class Demo08 {
    public static void main(String[] args) {
        //创建集合
        Set<String> a = new HashSet<>();
        //添加数据
        a.add("华为");
        a.add("魅族");
        a.add("小米");
        System.out.println("数据个数:"+a.size());
        System.out.println(a);
        //删除数据
        //a.remove("华为");
        //System.out.println(a);
        //遍历
        for (String s:a) {
            System.out.println(s);
        }
        System.out.println("==================");
        Iterator<String> b = a.iterator();
        while (b.hasNext()){
            System.out.println(b.next());
        }
        //判断
        System.out.println(a.contains("华为"));
        System.out.println(a.isEmpty());
    }
}

HashSet【重点】

基于HashCode计算元素存放位置。

当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。

存储结构:哈希表(数组+链表+红黑树)

存储过程:

  1. 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
  2. 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
package United;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        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 "Person[name="+name+",age="+age+"]";
    }

    @Override
    public int hashCode() {
        int n1 = this.name.hashCode();
        int n2 = this.age;
        return n1+n2;
    }

    @Override
    public boolean equals(Object obj) {
       if (this==obj){
           return true;
       }
       if (obj==null){
           return false;
       }
       if (obj instanceof Person){
           Person p = (Person) obj;

           if (this.name.equals(p.getName())&&this.age==p.getAge()){
               return true;
           }
       }
       return false;
    }
}

package United;

import java.util.HashSet;
import java.util.Iterator;

//HashSet集合的使用(2)
/*
    存储过程:
        1. 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
        2. 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表
 */
public class Demo0902 {
    public static void main(String[] args) {
        //创建集合
        HashSet<Person> a = new HashSet<>();
        //添加数据
        Person p1 = new Person("邱淑贞",45);
        Person p2 = new Person("张柏芝",43);
        Person p3 = new Person("章子怡",42);
        a.add(p1);
        a.add(p3);
        a.add(new Person("张柏芝",43));//这里重写了Person中的HashCode方法,所以能添加进来(在没有重写equals方法的时候),重写了equals后不能加进来equals判断比HashCode高层级
        a.add(p2);//重复元素不能添加
        System.out.println("元素的个数:"+a.size());
        System.out.println(a.toString());
        //删除数据
        //a.remove("张柏芝");
        //System.out.println("删除之后:"+a.size());
        //遍历
        for (Person p:a) {
            System.out.println(p);
        }
        System.out.println("=======================");
        Iterator<Person> b = a.iterator();
        while (b.hasNext()){
            System.out.println(b.next());
        }
        //判断
        System.out.println(a.contains("张柏芝"));
        System.out.println(a.isEmpty());
    }
}

TreeSet

基于排列顺序实现元素不重复。

实现了SortedSet接口,对集合元素自动排序。

元素对象的类型必须实现Comparable接口,指定排序规则。

通过CompareTo方法确定是否为重复元素。

package United;

import java.util.Iterator;
import java.util.TreeSet;

//TreeSet的使用
public class Demo10 {
    public static void main(String[] args) {
        //创建集合
        TreeSet<String> a = new TreeSet<>();
        //添加元素
        a.add("xyz");
        a.add("def");
        a.add("abc");
        System.out.println("元素个数:"+a.size());
        System.out.println(a);
        //删除数据
        //a.remove("xyz");
        //遍历
        for (String s:a) {
            System.out.println(s);
        }
        System.out.println("====================");
        Iterator<String> b = a.iterator();
        while (b.hasNext()){
            System.out.println(b.next());
        }
        //判断
        System.out.println(a.contains("xyz"));
        System.out.println(a.isEmpty());
    }
}

package United;

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

    public Person() {
    }

    public Person(String name, int age) {
        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 "Person[name="+name+",age="+age+"]";
    }
        //先按姓名比再按年龄比
    @Override
    public int compareTo(Person o) {
        int n1 = this.getName().compareTo(o.getName());
        int n2 = this.age-o.getAge();
        return n1 == 0?n2:n1;
    }
}

package United;

import java.util.Iterator;
import java.util.TreeSet;

//使用TreeSet保存数据
//要求:元素必须实现Comparable接口,compareTo();方法返回值为0,认为是重复元素
public class Demo11 {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Person> a = new TreeSet<>();
        //添加元素
        Person p1 = new Person("邱淑贞",45);
        Person p2 = new Person("张柏芝",43);
        Person p3 = new Person("章子怡",42);
        a.add(p1);
        a.add(p2);
        a.add(p3);
        System.out.println("元素个数:"+a.size());
        System.out.println(a);
        //删除
        //a.remove(p1);
        //遍历
        for (Person p:a) {
            System.out.println(p);
        }
        System.out.println("=====================");
        Iterator<Person> b = a.iterator();
        while (b.hasNext()){
            System.out.println(b.next());
        }
        //判断
        System.out.println(a.contains(new Person("章子怡",42)));
        System.out.println(a.isEmpty());
    }
}

package United;

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

//TreeSet集合的使用
//Comparator:实现定制比较(比较器)
public class Demo12 {
    public static void main(String[] args) {
        //创建集合并指定规则
        TreeSet<Person> a = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n1 = o1.getAge()- o2.getAge();
                int n2 = o1.getName().compareTo(o2.getName());
                return n1==0?n2:n1;
            }
        });
        Person p1 = new Person("邱淑贞",45);
        Person p2 = new Person("张柏芝",43);
        Person p3 = new Person("章子怡",42);
        a.add(p1);
        a.add(p2);
        a.add(p3);
        System.out.println("元素的个数:"+a.size());
        System.out.println(a);
    }
}

TreeSet案例

package United;

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

//TreeSet案例
//要求:实现字符串按照长度进行排序
//helloworld  zhang  lisi  wangwu  beijing xian nanjing
public class Demo13 {
    public static void main(String[] args) {
        //创建集合,并指定比较规则
        TreeSet<String> a = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int n1 = o1.length()-o2.length();
                int n2 = o1.compareTo(o2);
                return n1==0?n2:n1;
            }
        });
        a.add("helloworld");
        a.add("zhang");
        a.add("lisi");
        a.add("wangwu");
        a.add("beijing");
        a.add("xian");
        a.add("nanjing");
        System.out.println(a);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学习争取保研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值