day17(HashSet,TreeSet)

来源:互联网 发布:淘宝怎么设置客服认证 编辑:程序博客网 时间:2024/06/16 09:32

一.HashSet

1.Set集合

*一个不包含重复元素的 collection,且无顺序

2.HashSet存储自定义对象保证元素唯一性

public class temp2 {    public static void main(String[] args) {        HashSet<String> sSet = new HashSet<>();        sSet.add("a");        sSet.add("b");        sSet.add("a");        System.out.println(sSet);    }}// b a

3.HashSet如何保证元素唯一性的原理

  • a.HashSet原理

        * 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数    * 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象        如果没有哈希值相同的对象就直接存入集合        如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
  • b.将自定义类的对象存入HashSet去重复

    * 类中必须重写hashCode()和equals()方法* hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)* equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

4.LinkedHashSet的概述和使用

5.练习题

  • a.产生10个1-20之间的随机数要求随机数不能重复
  • b.用Scanner从键盘读取一行输入,去掉其中重复字符
/*使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 * aaaabbbcccddd*/public class Temp7 {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        System.out.println("请输入一行字符:");        String string = scanner.nextLine();        char[] cs = string.toCharArray();        Set<Character> cSet = new HashSet<Character>();        for (Character character : cs) {            cSet.add(character);        }        System.out.println(cSet);    }}
  • c.将集合中的重复元素去掉
public class Temp {    /*     * 将集合中的重复元素去掉     */    public static void main(String[] args) {        List<Integer> list = new ArrayList<>();        list.add(4);        list.add(5);        list.add(45);        list.add(4);        list.add(45);        System.out.println(list);        Set<Integer> set = new HashSet<>();        set.addAll(list);        list.clear();        list.addAll(set);        System.out.println(list);    }}

二.TreeSet

1概念

*使用元素的自然顺序(Comparable接口)对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。 

2.TreeSet存储自定义对象

//创建Person对象,并实现Comparable接口public class Person implements Comparable<Person> {    private String name;    private int age;    public Person(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    //参数p为已创建的Person对象    public int compareTo(Person p) {        // 比较名字,即比较字符串        // return this.name.compareTo(p.name);        // 比较年龄        // return this.age - p.age;        // 按照姓名的长度排序        return this.name.length() - p.name.length();    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + "]";    }}public class Temp12 {    public static void main(String[] args) {        TreeSet<Person> tSet = new TreeSet<>();        tSet.add(new Person("ass", 23));        tSet.add(new Person("ds", 13));        tSet.add(new Person("essss", 21));        tSet.add(new Person("bsss", 17));        List<Person> list = new ArrayList<>();        list.addAll(tSet);        for (Person person : list) {            System.out.println(person);        }    }}

3.TreeSet保证元素唯一和比较器排序的原理及代码实现)

4.TreeSet原理

  • a.特点

    * TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
  • b.使用方式

    • 自然顺序(Comparable)
      • TreeSet类的add()方法中会把存入的对象提升为Comparable类型
      • 调用对象的compareTo()方法和集合中的对象比较
      • 根据compareTo()方法返回的结果进行存储
    • 比较器顺序(Comparator)
      • 创建TreeSet的时候可以制定 一个Comparator
      • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
      • add()方法内部会自动调用Comparator接口中compare()方法排序
      • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
    • 两种方式的区别
      • TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
      • TreeSet如果传入Comparator, 就优先按照Comparator

5.集合框架练习

  • a.在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复
  • b.从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt
  • c.程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印.
  • d.键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。

6.List,Map总结

  • List
    • a.普通for循环, 使用get()逐个获取
    • b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • c.增强for循环, 只要可以使用Iterator的类都可以用
    • d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
  • Set
    • a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • b.增强for循环, 只要可以使用Iterator的类都可以用
  • 普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除
原创粉丝点击