zoukankan      html  css  js  c++  java
  • Java笔记(17):集合框架(03)

    1、登录注册分析及代码实现

    分析:

    需求:用户登录注册案例。

    按照如下的操作,可以让我们更符号面向对象思想
    A:有哪些类呢?
    B:每个类有哪些东西呢?
    C:类与类之间的关系是什么呢?

    分析:
    A:有哪些类呢?
    用户类
    测试类
    B:每个类有哪些东西呢?
    用户类:
    成员变量:用户名,密码
    构造方法:无参构造
    成员方法:getXxx()/setXxx()
    登录,注册

    假如用户类的内容比较对,将来维护起来就比较麻烦,为了更清晰的分类,我们就把用户又划分成了两类
    用户基本描述类
    成员变量:用户名,密码
    构造方法:无参构造
    成员方法:getXxx()/setXxx()
    用户操作类
    登录,注册
    测试类:
    main方法。
    C:类与类之间的关系是什么呢?
    在测试类中创建用户操作类和用户基本描述类的对象,并使用其功能。

    分包:
    A:功能划分
    B:模块划分
    C:先按模块划分,再按功能划分

    今天我们选择按照功能划分:
    用户基本描述类包 cn.itcast.pojo
    用户操作接口 cn.itcast.dao
    用户操作类包 cn.itcast.dao.impl
    用户测试类 cn.itcast.test

    1)用户基本描述类实现:

     1 package cn.itcast.pojo;
     2 
     3 /**
     4  * 这是用户基本描述类
     5  * 
     6  * @author 风清扬
     7  * @version V1.0
     8  * 
     9  */
    10 public class User {
    11     // 用户名
    12     private String username;
    13     // 密码
    14     private String password;
    15 
    16     public User() {
    17     }
    18 
    19     public String getUsername() {
    20         return username;
    21     }
    22 
    23     public void setUsername(String username) {
    24         this.username = username;
    25     }
    26 
    27     public String getPassword() {
    28         return password;
    29     }
    30 
    31     public void setPassword(String password) {
    32         this.password = password;
    33     }
    34 }

    2)用户操作接口的实现:

     1 package cn.itcast.dao;
     2 
     3 import cn.itcast.pojo.User;
     4 
     5 /**
     6  * 这是针对用户进行操作的接口
     7  * 
     8  * @author 风清扬
     9  * @version V1.0
    10  * 
    11  */
    12 public interface UserDao {
    13     /**
    14      * 这是用户登录功能
    15      * 
    16      * @param username
    17      *            用户名
    18      * @param password
    19      *            密码
    20      * @return 返回登录是否成功
    21      */
    22     public abstract boolean isLogin(String username, String password);
    23 
    24     /**
    25      * 这是用户注册功能
    26      * 
    27      * @param user
    28      *            要注册的用户信息
    29      */
    30     public abstract void regist(User user);
    31 }

    3)用户操作类的具体实现:

     1 package cn.itcast.dao.impl;
     2 
     3 import java.util.ArrayList;
     4 
     5 import cn.itcast.dao.UserDao;
     6 import cn.itcast.pojo.User;
     7 
     8 /**
     9  * 这是用户操作的具体实现类(集合版)
    10  * 
    11  * @author 风清扬
    12  * @version V1.0
    13  * 
    14  */
    15 public class UserDaoImpl implements UserDao {
    16     // 为了让多个方法能够使用同一个集合,就把集合定义为成员变量
    17     // 为了不让外人看到,用private
    18     // 为了让多个对象共享同一个成员变量,用static
    19     private static ArrayList<User> array = new ArrayList<User>();
    20 
    21     @Override
    22     public boolean isLogin(String username, String password) {
    23         // 遍历集合,获取每一个用户,并判断该用户的用户名和密码是否和传递过来的匹配
    24         boolean flag = false;
    25 
    26         for (User u : array) {
    27             if (u.getUsername().equals(username)
    28                     && u.getPassword().equals(password)) {
    29                 flag = true;
    30                 break;
    31             }
    32         }
    33 
    34         return flag;
    35     }
    36 
    37     @Override
    38     public void regist(User user) {
    39         // 把用户信息存储集合
    40         // ArrayList<User> array = new ArrayList<User>();
    41         array.add(user);
    42     }
    43 }

    4)猜数字小游戏类的实现:

     1 package cn.itcast.game;
     2 
     3 import java.util.Scanner;
     4 
     5 /**
     6  * 这是猜数字小游戏
     7  * 
     8  * @author 风清扬
     9  * @version V1.0
    10  * 
    11  */
    12 public class GuessNumber {
    13     private GuessNumber() {
    14     }
    15 
    16     public static void start() {
    17         // 产生一个随机数
    18         int number = (int) (Math.random() * 100) + 1;
    19 
    20         // 定义一个统计变量
    21         int count = 0;
    22 
    23         while (true) {
    24             // 键盘录入一个数据
    25             Scanner sc = new Scanner(System.in);
    26             System.out.println("请输入数据(1-100):");
    27             int guessNumber = sc.nextInt();
    28 
    29             count++;
    30 
    31             // 判断
    32             if (guessNumber > number) {
    33                 System.out.println("你猜的数据" + guessNumber + "大了");
    34             } else if (guessNumber < number) {
    35                 System.out.println("你猜的数据" + guessNumber + "小了");
    36             } else {
    37                 System.out.println("恭喜你," + count + "次就猜中了");
    38                 break;
    39             }
    40         }
    41     }
    42 }

    5)用户测试类的实现

      1 package cn.itcast.test;
      2 
      3 import java.util.Scanner;
      4 
      5 import cn.itcast.dao.UserDao;
      6 import cn.itcast.dao.impl.UserDaoImpl;
      7 import cn.itcast.game.GuessNumber;
      8 import cn.itcast.pojo.User;
      9 
     10 /**
     11  * 用户测试类
     12  * 
     13  * @author 风清扬
     14  * @version V1.0
     15  * 
     16  *          新增加了两个小问题 A:多个对象共享同一个成员变量,用静态
     17  *          B:循环里面如果有switch,并且在switch里面有break,那么结束的不是循环,而是switch语句
     18  * 
     19  */
     20 public class UserTest {
     21     public static void main(String[] args) {
     22         // 为了能够回来
     23         while (true) {
     24             // 欢迎界面,给出选择项
     25             System.out.println("--------------欢迎光临--------------");
     26             System.out.println("1 登录");
     27             System.out.println("2 注册");
     28             System.out.println("3 退出");
     29             System.out.println("请输入你的选择:");
     30             // 键盘录入选择,根据选择做不同的操作
     31             Scanner sc = new Scanner(System.in);
     32             // 为了后面的录入信息的方便,我所有的数据录入全部用字符接收
     33             String choiceString = sc.nextLine();
     34 
     35             // switch语句的多个地方要使用,我就定义到外面
     36             UserDao ud = new UserDaoImpl();
     37 
     38             // 经过简单的思考,我选择了switch
     39             switch (choiceString) {
     40             case "1":
     41                 // 登录界面,请输入用户名和密码
     42                 System.out.println("--------------登录界面--------------");
     43                 System.out.println("请输入用户名:");
     44                 String username = sc.nextLine();
     45                 System.out.println("请输入密码:");
     46                 String password = sc.nextLine();
     47 
     48                 // 调用登录功能
     49                 // UserDao ud = new UserDaomImpl();
     50 
     51                 boolean flag = ud.isLogin(username, password);
     52                 if (flag) {
     53                     System.out.println("登录成功,可以开始玩游戏了");
     54 
     55                     System.out.println("你玩吗?y/n");
     56                     while (true) {
     57                         String resultString = sc.nextLine();
     58                         if (resultString.equalsIgnoreCase("y")) {
     59                             // 玩游戏
     60                             GuessNumber.start();
     61                             System.out.println("你还玩吗?y/n");
     62                         } else {
     63                             break;
     64                         }
     65                     }
     66                     System.out.println("谢谢使用,欢迎下次再来");
     67                     System.exit(0);
     68                     // break; //这里写break,结束的是switch
     69                 } else {
     70                     System.out.println("用户名或者密码有误,登录失败");
     71                 }
     72                 break;
     73             case "2":
     74                 // 欢迎界面,请输入用户名和密码
     75                 System.out.println("--------------注册界面--------------");
     76                 System.out.println("请输入用户名:");
     77                 String newUsername = sc.nextLine();
     78                 System.out.println("请输入密码:");
     79                 String newPassword = sc.nextLine();
     80 
     81                 // 把用户名和密码封装到一个对象中
     82                 User user = new User();
     83                 user.setUsername(newUsername);
     84                 user.setPassword(newPassword);
     85 
     86                 // 调用注册功能
     87                 // 多态
     88                 // UserDao ud = new UserDaoImpl();
     89                 // 具体类使用
     90                 // UserDaoImpl udi = new UserDaoImpl();
     91 
     92                 ud.regist(user);
     93                 System.out.println("注册成功");
     94                 break;
     95             case "3":
     96             default:
     97                 System.out.println("谢谢使用,欢迎下次再来");
     98                 System.exit(0);
     99                 break;
    100             }
    101         }
    102     }
    103 }

     2、Set集合概述及特点

     1 package cn.itcast_01;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 /*
     7  * Collection
     8  *         |--List
     9  *             有序(存储顺序和取出顺序一致),可重复
    10  *         |--Set
    11  *             无序(存储顺序和取出顺序不一致),唯一
    12  * 
    13  * HashSet:它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
    14  * 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,
    15  * 而你的顺序恰好和它的存储顺序一致,这代表不了有序,你可以多存储一些数据,就能看到效果。
    16  */
    17 public class SetDemo {
    18     public static void main(String[] args) {
    19         // 创建集合对象
    20         Set<String> set = new HashSet<String>();
    21 
    22         // 创建并添加元素
    23         set.add("hello");
    24         set.add("java");
    25         set.add("world");
    26         set.add("java");
    27         set.add("world");
    28 
    29         // 增强for
    30         for (String s : set) {
    31             System.out.println(s);
    32         }
    33     }
    34 }

    3、HashSet保证元素唯一性的源码解析

     1 package cn.itcast_02;
     2 
     3 import java.util.HashSet;
     4 
     5 /*
     6  * HashSet:存储字符串并遍历
     7  * 问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
     8  * 通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
     9  * 步骤:
    10  *         首先比较哈希值
    11  *         如果相同,继续走,比较地址值或者走equals()
    12  *         如果不同,就直接添加到集合中    
    13  * 按照方法的步骤来说:    
    14  *         先看hashCode()值是否相同
    15  *             相同:继续走equals()方法
    16  *                 返回true:    说明元素重复,就不添加
    17  *                 返回false:说明元素不重复,就添加到集合
    18  *             不同:就直接把元素添加到集合
    19  * 如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
    20  * 而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
    21  */
    22 public class HashSetDemo {
    23     public static void main(String[] args) {
    24         // 创建集合对象
    25         HashSet<String> hs = new HashSet<String>();
    26 
    27         // 创建并添加元素
    28         hs.add("hello");
    29         hs.add("world");
    30         hs.add("java");
    31         hs.add("world");
    32 
    33         // 遍历集合
    34         for (String s : hs) {
    35             System.out.println(s);
    36         }
    37     }
    38 }

    4、HashSet存储自定义对象并遍历

     1 package cn.itcast_02;
     2 
     3 /**
     4  * @author Administrator
     5  * 
     6  */
     7 public class Student {
     8     private String name;
     9     private int age;
    10 
    11     public Student() {
    12         super();
    13     }
    14 
    15     public Student(String name, int age) {
    16         super();
    17         this.name = name;
    18         this.age = age;
    19     }
    20 
    21     public String getName() {
    22         return name;
    23     }
    24 
    25     public void setName(String name) {
    26         this.name = name;
    27     }
    28 
    29     public int getAge() {
    30         return age;
    31     }
    32 
    33     public void setAge(int age) {
    34         this.age = age;
    35     }
    36 
    37     @Override
    38     public int hashCode() {
    39         final int prime = 31;
    40         int result = 1;
    41         result = prime * result + age;
    42         result = prime * result + ((name == null) ? 0 : name.hashCode());
    43         return result;
    44     }
    45 
    46     @Override
    47     public boolean equals(Object obj) {
    48         if (this == obj)
    49             return true;
    50         if (obj == null)
    51             return false;
    52         if (getClass() != obj.getClass())
    53             return false;
    54         Student other = (Student) obj;
    55         if (age != other.age)
    56             return false;
    57         if (name == null) {
    58             if (other.name != null)
    59                 return false;
    60         } else if (!name.equals(other.name))
    61             return false;
    62         return true;
    63     }
    64 
    65     // @Override
    66     // public int hashCode() {
    67     // // return 0;
    68     // // 因为成员变量值影响了哈希值,所以我们把成员变量值相加即可
    69     // // return this.name.hashCode() + this.age;
    70     // // 看下面
    71     // // s1:name.hashCode()=40,age=30
    72     // // s2:name.hashCode()=20,age=50
    73     // // 尽可能的区分,我们可以把它们乘以一些整数
    74     // return this.name.hashCode() + this.age * 15;
    75     // }
    76     //
    77     // @Override
    78     // public boolean equals(Object obj) {
    79     // // System.out.println(this + "---" + obj);
    80     // if (this == obj) {
    81     // return true;
    82     // }
    83     //
    84     // if (!(obj instanceof Student)) {
    85     // return false;
    86     // }
    87     //
    88     // Student s = (Student) obj;
    89     // return this.name.equals(s.name) && this.age == s.age;
    90     // }
    91     //
    92     // @Override
    93     // public String toString() {
    94     // return "Student [name=" + name + ", age=" + age + "]";
    95     // }
    96 
    97 }
     1 package cn.itcast_02;
     2 
     3 import java.util.HashSet;
     4 
     5 /*
     6  * 需求:存储自定义对象,并保证元素的唯一性
     7  * 要求:如果两个对象的成员变量值都相同,则为同一个元素。
     8  * 
     9  * 目前是不符合我的要求的:因为我们知道HashSet底层依赖的是hashCode()和equals()方法。
    10  * 而这两个方法我们在学生类中没有重写,所以,默认使用的是Object类。
    11  * 这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作。
    12  */
    13 public class HashSetDemo2 {
    14     public static void main(String[] args) {
    15         // 创建集合对象
    16         HashSet<Student> hs = new HashSet<Student>();
    17 
    18         // 创建学生对象
    19         Student s1 = new Student("林青霞", 27);
    20         Student s2 = new Student("柳岩", 22);
    21         Student s3 = new Student("王祖贤", 30);
    22         Student s4 = new Student("林青霞", 27);
    23         Student s5 = new Student("林青霞", 20);
    24         Student s6 = new Student("范冰冰", 22);
    25 
    26         // 添加元素
    27         hs.add(s1);
    28         hs.add(s2);
    29         hs.add(s3);
    30         hs.add(s4);
    31         hs.add(s5);
    32         hs.add(s6);
    33 
    34         // 遍历集合
    35         for (Student s : hs) {
    36             System.out.println(s.getName() + "---" + s.getAge());
    37         }
    38     }
    39 }

    练习:HashSet存储自定义对象并遍历练习

     1 package cn.itcast_03;
     2 
     3 public class Dog {
     4     private String name;
     5     private int age;
     6     private String color;
     7     private char sex;
     8 
     9     public Dog() {
    10         super();
    11     }
    12 
    13     public Dog(String name, int age, String color, char sex) {
    14         super();
    15         this.name = name;
    16         this.age = age;
    17         this.color = color;
    18         this.sex = sex;
    19     }
    20 
    21     public String getName() {
    22         return name;
    23     }
    24 
    25     public void setName(String name) {
    26         this.name = name;
    27     }
    28 
    29     public int getAge() {
    30         return age;
    31     }
    32 
    33     public void setAge(int age) {
    34         this.age = age;
    35     }
    36 
    37     public String getColor() {
    38         return color;
    39     }
    40 
    41     public void setColor(String color) {
    42         this.color = color;
    43     }
    44 
    45     public char getSex() {
    46         return sex;
    47     }
    48 
    49     public void setSex(char sex) {
    50         this.sex = sex;
    51     }
    52 
    53     @Override
    54     public int hashCode() {
    55         final int prime = 31;
    56         int result = 1;
    57         result = prime * result + age;
    58         result = prime * result + ((color == null) ? 0 : color.hashCode());
    59         result = prime * result + ((name == null) ? 0 : name.hashCode());
    60         result = prime * result + sex;
    61         return result;
    62     }
    63 
    64     @Override
    65     public boolean equals(Object obj) {
    66         if (this == obj)
    67             return true;
    68         if (obj == null)
    69             return false;
    70         if (getClass() != obj.getClass())
    71             return false;
    72         Dog other = (Dog) obj;
    73         if (age != other.age)
    74             return false;
    75         if (color == null) {
    76             if (other.color != null)
    77                 return false;
    78         } else if (!color.equals(other.color))
    79             return false;
    80         if (name == null) {
    81             if (other.name != null)
    82                 return false;
    83         } else if (!name.equals(other.name))
    84             return false;
    85         if (sex != other.sex)
    86             return false;
    87         return true;
    88     }
    89 
    90 }
     1 package cn.itcast_03;
     2 
     3 import java.util.HashSet;
     4 
     5 /*
     6  * HashSet集合存储自定义对象并遍历。如果对象的成员变量值相同即为同一个对象
     7  * 
     8  * 注意了:
     9  *         你使用的是HashSet集合,这个集合的底层是哈希表结构。
    10  *         而哈希表结构底层依赖:hashCode()和equals()方法。
    11  *         如果你认为对象的成员变量值相同即为同一个对象的话,你就应该重写这两个方法。
    12  *         如何重写呢?不同担心,自动生成即可。
    13  */
    14 public class DogDemo {
    15     public static void main(String[] args) {
    16         // 创建集合对象
    17         HashSet<Dog> hs = new HashSet<Dog>();
    18 
    19         // 创建狗对象
    20         Dog d1 = new Dog("秦桧", 25, "红色", '男');
    21         Dog d2 = new Dog("高俅", 22, "黑色", '女');
    22         Dog d3 = new Dog("秦桧", 25, "红色", '男');
    23         Dog d4 = new Dog("秦桧", 20, "红色", '女');
    24         Dog d5 = new Dog("魏忠贤", 28, "白色", '男');
    25         Dog d6 = new Dog("李莲英", 23, "黄色", '女');
    26         Dog d7 = new Dog("李莲英", 23, "黄色", '女');
    27         Dog d8 = new Dog("李莲英", 23, "黄色", '男');
    28 
    29         // 添加元素
    30         hs.add(d1);
    31         hs.add(d2);
    32         hs.add(d3);
    33         hs.add(d4);
    34         hs.add(d5);
    35         hs.add(d6);
    36         hs.add(d7);
    37         hs.add(d8);
    38 
    39         // 遍历
    40         for (Dog d : hs) {
    41             System.out.println(d.getName() + "---" + d.getAge() + "---"
    42                     + d.getColor() + "---" + d.getSex());
    43         }
    44     }
    45 }

     5、LinkedHashSet的概述和使用

     1 package cn.itcast_04;
     2 
     3 import java.util.LinkedHashSet;
     4 
     5 /*
     6  * LinkedHashSet:底层数据结构由哈希表和链表组成。
     7  * 哈希表保证元素的唯一性。
     8  * 链表保证元素有素。(存储和取出是一致)
     9  */
    10 public class LinkedHashSetDemo {
    11     public static void main(String[] args) {
    12         // 创建集合对象
    13         LinkedHashSet<String> hs = new LinkedHashSet<String>();
    14 
    15         // 创建并添加元素
    16         hs.add("hello");
    17         hs.add("world");
    18         hs.add("java");
    19         hs.add("world");
    20         hs.add("java");
    21 
    22         // 遍历
    23         for (String s : hs) {
    24             System.out.println(s);
    25         }
    26     }
    27 }

     6、TreeSet存储Integer类型的元素并遍历

     1 package cn.itcast_05;
     2 
     3 import java.util.TreeSet;
     4 
     5 /*
     6  * TreeSet:能够对元素按照某种规则进行排序。
     7  * 排序有两种方式
     8  * A:自然排序
     9  * B:比较器排序
    10  * 
    11  * TreeSet集合的特点:排序和唯一
    12  * 
    13  * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
    14  */
    15 public class TreeSetDemo {
    16     public static void main(String[] args) {
    17         // 创建集合对象
    18         // 自然顺序进行排序
    19         TreeSet<Integer> ts = new TreeSet<Integer>();
    20 
    21         // 创建元素并添加
    22         // 20,18,23,22,17,24,19,18,24
    23         ts.add(20);
    24         ts.add(18);
    25         ts.add(23);
    26         ts.add(22);
    27         ts.add(17);
    28         ts.add(24);
    29         ts.add(19);
    30         ts.add(18);
    31         ts.add(24);
    32 
    33         // 遍历
    34         for (Integer i : ts) {
    35             System.out.println(i);
    36         }
    37     }
    38 }

     7、TreeSet保证元素唯一性和自然排序的原理和图解

    练习:TreeSet存储自定义对象并遍历练习1

     1 package cn.itcast_05;
     2 
     3 /*
     4  * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
     5  */
     6 public class Student implements Comparable<Student> {
     7     private String name;
     8     private int age;
     9 
    10     public Student() {
    11         super();
    12     }
    13 
    14     public Student(String name, int age) {
    15         super();
    16         this.name = name;
    17         this.age = age;
    18     }
    19 
    20     public String getName() {
    21         return name;
    22     }
    23 
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27 
    28     public int getAge() {
    29         return age;
    30     }
    31 
    32     public void setAge(int age) {
    33         this.age = age;
    34     }
    35 
    36     @Override
    37     public int compareTo(Student s) {
    38         // return 0;
    39         // return 1;
    40         // return -1;
    41 
    42         // 这里返回什么,其实应该根据我的排序规则来做
    43         // 按照年龄排序,主要条件
    44         int num = this.age - s.age;
    45         // 次要条件
    46         // 年龄相同的时候,还得去看姓名是否也相同
    47         // 如果年龄和姓名都相同,才是同一个元素
    48         int num2 = num == 0 ? this.name.compareTo(s.name) : num;
    49         return num2;
    50     }
    51 }
     1 package cn.itcast_05;
     2 
     3 import java.util.TreeSet;
     4 
     5 /*
     6  * TreeSet存储自定义对象并保证排序和唯一。
     7  * 
     8  * A:你没有告诉我们怎么排序
     9  *         自然排序,按照年龄从小到大排序
    10  * B:元素什么情况算唯一你也没告诉我
    11  *         成员变量值都相同即为同一个元素
    12  */
    13 public class TreeSetDemo2 {
    14     public static void main(String[] args) {
    15         // 创建集合对象
    16         TreeSet<Student> ts = new TreeSet<Student>();
    17 
    18         // 创建元素
    19         Student s1 = new Student("linqingxia", 27);
    20         Student s2 = new Student("zhangguorong", 29);
    21         Student s3 = new Student("wanglihong", 23);
    22         Student s4 = new Student("linqingxia", 27);
    23         Student s5 = new Student("liushishi", 22);
    24         Student s6 = new Student("wuqilong", 40);
    25         Student s7 = new Student("fengqingy", 22);
    26 
    27         // 添加元素
    28         ts.add(s1);
    29         ts.add(s2);
    30         ts.add(s3);
    31         ts.add(s4);
    32         ts.add(s5);
    33         ts.add(s6);
    34         ts.add(s7);
    35 
    36         // 遍历
    37         for (Student s : ts) {
    38             System.out.println(s.getName() + "---" + s.getAge());
    39         }
    40     }
    41 }

     练习:TreeSet存储自定义对象并遍历练习2

     1 package cn.itcast_06;
     2 
     3 /*
     4  * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
     5  */
     6 public class Student implements Comparable<Student> {
     7     private String name;
     8     private int age;
     9 
    10     public Student() {
    11         super();
    12     }
    13 
    14     public Student(String name, int age) {
    15         super();
    16         this.name = name;
    17         this.age = age;
    18     }
    19 
    20     public String getName() {
    21         return name;
    22     }
    23 
    24     public void setName(String name) {
    25         this.name = name;
    26     }
    27 
    28     public int getAge() {
    29         return age;
    30     }
    31 
    32     public void setAge(int age) {
    33         this.age = age;
    34     }
    35 
    36     @Override
    37     public int compareTo(Student s) {
    38         // 主要条件 姓名的长度
    39         int num = this.name.length() - s.name.length();
    40         // 姓名的长度相同,不代表姓名的内容相同
    41         int num2 = num == 0 ? this.name.compareTo(s.name) : num;
    42         // 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄
    43         int num3 = num2 == 0 ? this.age - s.age : num2;
    44         return num3;
    45     }
    46 }
     1 package cn.itcast_06;
     2 
     3 import java.util.TreeSet;
     4 
     5 /*
     6  * 需求:请按照姓名的长度排序
     7  */
     8 public class TreeSetDemo {
     9     public static void main(String[] args) {
    10         // 创建集合对象
    11         TreeSet<Student> ts = new TreeSet<Student>();
    12 
    13         // 创建元素
    14         Student s1 = new Student("linqingxia", 27);
    15         Student s2 = new Student("zhangguorong", 29);
    16         Student s3 = new Student("wanglihong", 23);
    17         Student s4 = new Student("linqingxia", 27);
    18         Student s5 = new Student("liushishi", 22);
    19         Student s6 = new Student("wuqilong", 40);
    20         Student s7 = new Student("fengqingy", 22);
    21         Student s8 = new Student("linqingxia", 29);
    22 
    23         // 添加元素
    24         ts.add(s1);
    25         ts.add(s2);
    26         ts.add(s3);
    27         ts.add(s4);
    28         ts.add(s5);
    29         ts.add(s6);
    30         ts.add(s7);
    31         ts.add(s8);
    32 
    33         // 遍历
    34         for (Student s : ts) {
    35             System.out.println(s.getName() + "---" + s.getAge());
    36         }
    37     }
    38 }

    8、TreeSet保证元素唯一性和比较器排序的原理及代码实现

     1 package cn.itcast_07;
     2 
     3 public class Student {
     4     private String name;
     5     private int age;
     6 
     7     public Student() {
     8         super();
     9     }
    10 
    11     public Student(String name, int age) {
    12         super();
    13         this.name = name;
    14         this.age = age;
    15     }
    16 
    17     public String getName() {
    18         return name;
    19     }
    20 
    21     public void setName(String name) {
    22         this.name = name;
    23     }
    24 
    25     public int getAge() {
    26         return age;
    27     }
    28 
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32 }
     1 package cn.itcast_07;
     2 
     3 import java.util.Comparator;
     4 
     5 public class MyComparator implements Comparator<Student> {
     6 
     7     @Override
     8     public int compare(Student s1, Student s2) {
     9         // int num = this.name.length() - s.name.length();
    10         // this -- s1
    11         // s -- s2
    12         // 姓名长度
    13         int num = s1.getName().length() - s2.getName().length();
    14         // 姓名内容
    15         int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
    16         // 年龄
    17         int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
    18         return num3;
    19     }
    20 
    21 }
     1 package cn.itcast_07;
     2 
     3 import java.util.Comparator;
     4 import java.util.TreeSet;
     5 
     6 /*
     7  * 需求:请按照姓名的长度排序
     8  * 
     9  * TreeSet集合保证元素排序和唯一性的原理
    10  * 唯一性:是根据比较的返回是否是0来决定。
    11  * 排序:
    12  *         A:自然排序(元素具备比较性)
    13  *             让元素所属的类实现自然排序接口 Comparable
    14  *         B:比较器排序(集合具备比较性)
    15  *             让集合的构造方法接收一个比较器接口的子类对象 Comparator
    16  */
    17 public class TreeSetDemo {
    18     public static void main(String[] args) {
    19         // 创建集合对象
    20         // TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
    21         // public TreeSet(Comparator comparator) //比较器排序
    22         // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
    23 
    24         // 如果一个方法的参数是接口,那么真正要的是接口的实现类的对象
    25         // 而匿名内部类就可以实现这个东西
    26         TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
    27             @Override
    28             public int compare(Student s1, Student s2) {
    29                 // 姓名长度
    30                 int num = s1.getName().length() - s2.getName().length();
    31                 // 姓名内容
    32                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
    33                         : num;
    34                 // 年龄
    35                 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
    36                 return num3;
    37             }
    38         });
    39 
    40         // 创建元素
    41         Student s1 = new Student("linqingxia", 27);
    42         Student s2 = new Student("zhangguorong", 29);
    43         Student s3 = new Student("wanglihong", 23);
    44         Student s4 = new Student("linqingxia", 27);
    45         Student s5 = new Student("liushishi", 22);
    46         Student s6 = new Student("wuqilong", 40);
    47         Student s7 = new Student("fengqingy", 22);
    48         Student s8 = new Student("linqingxia", 29);
    49 
    50         // 添加元素
    51         ts.add(s1);
    52         ts.add(s2);
    53         ts.add(s3);
    54         ts.add(s4);
    55         ts.add(s5);
    56         ts.add(s6);
    57         ts.add(s7);
    58         ts.add(s8);
    59 
    60         // 遍历
    61         for (Student s : ts) {
    62             System.out.println(s.getName() + "---" + s.getAge());
    63         }
    64     }
    65 }

    练习:产生10个1-20之间的随机数要求随机数不能重复案例简洁版

     1 package cn.itcast_08;
     2 
     3 import java.util.HashSet;
     4 import java.util.Random;
     5 
     6 /*
     7  * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
     8  * 
     9  * 分析:
    10  *         A:创建随机数对象
    11  *         B:创建一个HashSet集合
    12  *         C:判断集合的长度是不是小于10
    13  *             是:就创建一个随机数添加
    14  *             否:不搭理它
    15  *         D:遍历HashSet集合
    16  */
    17 public class HashSetDemo {
    18     public static void main(String[] args) {
    19         // 创建随机数对象
    20         Random r = new Random();
    21 
    22         // 创建一个Set集合
    23         HashSet<Integer> ts = new HashSet<Integer>();
    24 
    25         // 判断集合的长度是不是小于10
    26         while (ts.size() < 10) {
    27             int num = r.nextInt(20) + 1;
    28             ts.add(num);
    29         }
    30 
    31         // 遍历Set集合
    32         for (Integer i : ts) {
    33             System.out.println(i);
    34         }
    35     }
    36 }

    练习:键盘录入学生信息按照总分排序后输出在控制台案例

     1 package cn.itcast_08;
     2 
     3 import java.util.Comparator;
     4 import java.util.Scanner;
     5 import java.util.TreeSet;
     6 
     7 /*
     8  * 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
     9  * 
    10  * 分析:
    11  *         A:定义学生类
    12  *         B:创建一个TreeSet集合
    13  *         C:总分从高到底如何实现呢?        
    14  *         D:键盘录入5个学生信息
    15  *         E:遍历TreeSet集合
    16  */
    17 public class TreeSetDemo {
    18     public static void main(String[] args) {
    19         // 创建一个TreeSet集合
    20         TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
    21             @Override
    22             public int compare(Student s1, Student s2) {
    23                 // 总分从高到低
    24                 int num = s2.getSum() - s1.getSum();
    25                 // 总分相同的不一定语文相同
    26                 int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
    27                 // 总分相同的不一定数序相同
    28                 int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
    29                 // 总分相同的不一定英语相同
    30                 int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;
    31                 // 姓名还不一定相同呢
    32                 int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName())
    33                         : num4;
    34                 return num5;
    35             }
    36         });
    37 
    38         System.out.println("学生信息录入开始");
    39         // 键盘录入5个学生信息
    40         for (int x = 1; x <= 5; x++) {
    41             Scanner sc = new Scanner(System.in);
    42             System.out.println("请输入第" + x + "个学生的姓名:");
    43             String name = sc.nextLine();
    44             System.out.println("请输入第" + x + "个学生的语文成绩:");
    45             String chineseString = sc.nextLine();
    46             System.out.println("请输入第" + x + "个学生的数学成绩:");
    47             String mathString = sc.nextLine();
    48             System.out.println("请输入第" + x + "个学生的英语成绩:");
    49             String englishString = sc.nextLine();
    50 
    51             // 把数据封装到学生对象中
    52             Student s = new Student();
    53             s.setName(name);
    54             s.setChinese(Integer.parseInt(chineseString));
    55             s.setMath(Integer.parseInt(mathString));
    56             s.setEnglish(Integer.parseInt(englishString));
    57 
    58             // 把学生对象添加到集合
    59             ts.add(s);
    60         }
    61         System.out.println("学生信息录入完毕");
    62 
    63         System.out.println("学习信息从高到低排序如下:");
    64         System.out.println("姓名	语文成绩	数学成绩	英语成绩");
    65         // 遍历集合
    66         for (Student s : ts) {
    67             System.out.println(s.getName() + "	" + s.getChinese() + "	"
    68                     + s.getMath() + "	" + s.getEnglish());
    69         }
    70     }
    71 }
    如欢如殇 授以青春鲜活肢体奔忙 如思如忘 驱以老朽深沉灵魂冥想 始自情热激荡 从未敢终于世事炎凉 无能执手相望 无法去尝试结发同床 无力至心死身僵 一息坚强 ------ 我一直没有放弃,如果你也能看到 修身 修禅
  • 相关阅读:
    mybatis返回map类型数据空值字段不显示(三种解决方法)
    linux各种资源查看
    ssh代理
    python 自定义ping编写
    python 备忘(协程,多进程)
    python 控制电源模块for循环写法
    XPath 语法
    python 自定义去掉特殊字符串
    ssh证书登陆vpc/并且反向代理
    cmder设置
  • 原文地址:https://www.cnblogs.com/lz2lhy/p/6921465.html
Copyright © 2011-2022 走看看