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 }