zoukankan      html  css  js  c++  java
  • java Set 内容集合,day17

    HashSet存储字符串并遍历

    特点是:存储唯一,不排序  Set集合,无索引,不可以重复,无序(存取不一致)

    *

      HashSet<String> hs = new HashSet<>();

    boolean b1 = hs.add("a");

    boolean b2 = hs.add("a"); //当存储不成功的时候,返回false

    System.out.println(b1);

    System.out.println(b2);

    for(String s : hs) {

    System.out.println(s);

    }

    HashSet如果想要存储自定义类对象,那么一定要重写hashcode equals 方法

    HashSet<Person> hs = new HashSet<>();

    hs.add(new Person("张三", 23));

    hs.add(new Person("张三", 23));

    hs.add(new Person("李四", 23));

    hs.add(new Person("李四", 23));

    hs.add(new Person("王五", 23));

    hs.add(new Person("赵六", 23));    

    Person 类中重写hashcode equals 方法

    1.HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象

    * 如果没有哈希值相同的对象就直接存入集合

    * 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存

    * 2.将自定义类的对象存入HashSet去重复

    * 类中必须重写hashCode()equals()方法

    * hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)

    * equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

    2.LinkedHashSet

     * 底层是链表实现的,set集合中唯一一个能保证怎么存就怎么取的集合对象.

    这个也保证元素唯一

    练习

    17.06_集合框架(产生101-20之间的随机数要求随机数不能重复)

    * A:案例演示

    * 需求:编写一个程序,获取10120的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。

    HashSet<Integer> hs = new HashSet<>(); //创建集合对象

    Random r = new Random(); //创建随机数对象

    while(hs.size() < 10) {

    int num = r.nextInt(20) + 1; //生成120的随机数

    hs.add(num);

    }

    for (Integer integer : hs) { //遍历集合

    System.out.println(integer); //打印每一个元素

    }

    ###17.07_集合框架(练习)

    * 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

    * aaaabbbcccddd

    Scanner sc = new Scanner(System.in); //创建键盘录入对象

    System.out.println("请输入一行字符串:");

    String line = sc.nextLine(); //将键盘录入的字符串存储在line

    char[] arr = line.toCharArray(); //将字符串转换成字符数组

    HashSet<Character> hs = new HashSet<>(); //创建HashSet集合对象

    for(char c : arr) { //遍历字符数组

    hs.add(c); //将字符数组中的字符添加到集合中

    }

    for (Character ch : hs) { //遍历集合

    System.out.println(ch);

    }

    ###17.08_集合框架(练习)

    * 将集合中的重复元素去掉

    *

    public static void main(String[] args) {

    ArrayList<String> list = new ArrayList<>();

    list.add("a");

    list.add("a");

    list.add("a");

    list.add("b");

    list.add("b");

    list.add("b");

    list.add("b");

    list.add("c");

    list.add("c");

    list.add("c");

    list.add("c");

    System.out.println(list);

    System.out.println("去除重复后:");

    getSingle(list);

    System.out.println(list);

    }

    /*

     * 将集合中的重复元素去掉

     * 1,void

     * 2,List<String> list

     */

    public static void getSingle(List<String> list) {

    LinkedHashSet<String> lhs = new LinkedHashSet<>();

    lhs.addAll(list); //list集合中的所有元素添加到lhs

    list.clear(); //清空原集合

    list.addAll(lhs); //将去除重复的元素添回到list

    }

    17.10_集合框架(TreeSet存储自定义对象)TreeSet 实现自定义类对象,必须要继承Comparable 接口 实现compareTo 方法)

    * A:案例演示

    * 存储Person对象

    要继承Comparable 接口 实现compareTo 方法

    TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一

     * compareTo方法返回0的时候集合中只有一个元素(表示相等)

     * compareTo方法返回正数的时候集合会怎么存就怎么取

     * compareTo方法返回负数的时候集合会倒序存储

    例如

    public static void demo4() {

    TreeSet<Person> ts = new TreeSet<>();

    ts.add(new Person("zhangsan", 23));

    ts.add(new Person("lisi", 13));

    ts.add(new Person("wangwu", 33));

    ts.add(new Person("zhaoliu", 43));

    ts.add(new Person("aaaa", 53));

    System.out.println(ts);

    }

    public class Person implements Comparable<Person> {

    public int compareTo(Person o) {

    int length = this.name.length() - o.name.length(); //比较长度为主要条件

    int num = length == 0 ? this.name.compareTo(o.name) : length; //比较内容为次要条件

    return num == 0 ? this.age - o.age : num;   //比较年龄为次要条件

    }

    }

    按照姓名排序

    public int compareTo(Person o) {

    int num = this.name.compareTo(o.name); //姓名是主要条件

    return num == 0 ? this.age - o.age : num; //年龄是次要条件

    }*/

    按照姓名长度排序

    public int compareTo(Person o) {

     int length = this.name.length() - o.name.length(); //比较长度为主要条件

     int num = length == 0 ? this.name.compareTo(o.name) : length; //比较内容为次要条件

     return num == 0 ? this.age - o.age : num; //比较年龄为次要条件

    }

    集合框架(TreeSet原理)

    * 1.特点

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

    * 2.使用方式

    * a.自然顺序(Comparable)

    * TreeSet类的add()方法中会把存入的对象提升为Comparable类型

    * 调用对象的compareTo()方法和集合中的对象比较

    * 根据compareTo()方法返回的结果进行存储

    * b.比较器顺序(Comparator)

    * 创建TreeSet的时候可以制定 一个Comparator

    * 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序

    * add()方法内部会自动调用Comparator接口中compare()方法排序

    * 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数

    * c.两种方式的区别

    * TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)

    * TreeSet如果传入Comparator, 就优先按照Comparator

    练习

    17.17_集合框架(练习)

    * 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt

    Scanner sc = new Scanner(System.in); //创建键盘录入对象

    System.out.println("请输入一行字符串:");

    String line = sc.nextLine(); //将键盘录入的字符串存储在line

    char[] arr = line.toCharArray(); //将字符串转换成字符数组

    TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {

    @Override

    public int compare(Character c1, Character c2) {

    //int num = c1.compareTo(c2);

    int num = c1 - c2; //自动拆箱

    return num == 0 ? 1 : num;

    }

    });

    for(char c : arr) {

    ts.add(c);

    }

    for(Character ch : ts) {

    System.out.print(ch);

    }

    练习

    集合框架(键盘录入学生信息按照总分排序后输出在控制台)

    * A:案例演示

    * 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。

    Scanner sc = new Scanner(System.in);

    System.out.println("请输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩)");

    TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {

    @Override

    public int compare(Student s1, Student s2) {

    int num = s2.getSum() - s1.getSum(); //根据学生的总成绩降序排列

    return num == 0 ? 1 : num;

    }

    });

    while(ts.size() < 5) {

    String line = sc.nextLine();

    try {

    String[] arr = line.split(",");

    int chinese = Integer.parseInt(arr[1]); //转换语文成绩

    int math = Integer.parseInt(arr[2]); //转换数学成绩

    int english = Integer.parseInt(arr[3]); //转换英语成绩

    ts.add(new Student(arr[0], chinese, math, english));

    } catch (Exception e) {

    System.out.println("录入格式有误,输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩");

    }

    }

    System.out.println("排序后的学生成绩是:");

    for (Student s : ts) {

    System.out.println(s);

    }

    Student

    public class Student {

    private String name;

    private int chinese;

    private int math;

    private int english;

    private int sum;

    public Student() {

    super();

    }

    public Student(String name, int chinese, int math, int english) {

    super();

    this.name = name;

    this.chinese = chinese;

    this.math = math;

    this.english = english;

    this.sum = this.chinese + this.math + this.english;

    }

    public int getSum() {

    return sum;

    }

    public String toString() {

    return name + "," + chinese + "," + math + "," + english + "," + sum;

    }

    }

    17.20_day17总结

    * 1.List

    * a.普通for循环, 使用get()逐个获取

    * b.调用iterator()方法得到Iterator, 使用hasNext()next()方法

    * c.增强for循环, 只要可以使用Iterator的类都可以用

    * d.Vector集合可以使用EnumerationhasMoreElements()nextElement()方法

    * 2.Set

    * a.调用iterator()方法得到Iterator, 使用hasNext()next()方法

    * b.增强for循环, 只要可以使用Iterator的类都可以用

    * 3.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除 

  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/lixiaowei395659729/p/6959475.html
Copyright © 2011-2022 走看看