第六章 集合(三)

 6.4 Set接口

6.4.1 Set接口简介

Set接口主要有两个实现类,分别是HashSet和TreeSet。其中HashSet是根据对象的散列值来自确定元素在集合中的存储位置,具有良好的存取和查找性能。HashSet是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。

6.4.2 HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。

import java.util.*;
public class Example07{
   public static void main(string[] args){
      Hashset set=new Hashset();//创建HashSet集合
      set.add("张三");
      set.add("李四");
      set.add("王五");
      set.add("李四");//向该Set集合中添加重复元素
      Iterator it=set.itereatoy();//获取Iterator对象
      while(it.hasNext()){//通过while循环,判断集合中是否有元素
       Object obj=it.next();//如果有元素,就通过迭代器的next()方法获取元素
           System.out.printLn(obj);
       }
   }
}
 
 

运行结果→

李四

张三

王五

当向集合中存入元素时,为保证HashSet正常工作,要求在存入对象时,重写Object类中的hashCode()和equals()方法。

案例学习 6-8

java.util.*;
class Student{
     String id;
     String name;
     public Student(string id,string name){//创建构造方法
          this.id=id;
          this.name=name;
     }
     public string toString(){
          return id+":"+name;//重写toString()方法
     }
}
public class Example08{
     public static void main(String[] args){
          HashSet hs=new HashSet();//创建HashSet集合
          Student stu1=new Student("1","张三");//创建Student对象
          Student stu2 new Student("2","李四");
          Student stu3=new Student("2","李四");
          hs.add(stul);
          hs.add(stu2);
          hs.add(stu3);
          System.out.println(hs);
     }
}

  运行结果→

[2:李四,2:李四,1:张三]

 6.4.3 TreeSet


 案例学习6—11

import java.util.Treeset;
public class Example11{
   public static void main(String[] args){
      TreeSet ts=new TreeSet();
      ts.add(3);
      ts.add(1);
      ts.add(1);
      ts.add(2);
      ts.add(3);
      System.out.println(ts);
   }
}


 运行结果→

[1,2,3]

  从打印结果可以看出,添加的元素已经自动排序,并且重复存入的整数1和3只添加了一次。

  TreeSet集合之所以可以对添加的元素进行排序,是因为元素的类可以实现Comparable接口(基本类型的包装类,String类都实现了该接口),Comparable接口强行对实现它的每个类的对象进行整体排序,这种排序称为类的自然排序。

案例学习 6-12

import java.util.TreeSet;
class Student implements Comparable<student>{
   private String id;
   private String name;
   public Student(string id,string name){
      this.id=id;
      this.name=name;
   }
   //重写toString()方法
   public String toString(){
      return id+","+name;
   @Override
   public int compareTo(Student o){
      //return 0;//集合中只有一个元素
      //return 1;//集合按照怎么存就怎么取
      return-1;//集合按照存入元素的倒序进行存储
   }
}
public class Example12{
   public static void main(string[] args){
      TreeSet ts=new TreeSet();
      ts.add(new Student("1","张三"));
      ts.add(new Student("2","李四"));
      ts.add(new Student("2","王五"));
      System.out.println(ts);
      }
}

 

  运行结果→

[2:王五,2:李四,1:张三]

【案例5-3 模拟用户注册

【案例介绍】

1.任务描述

互联网为人们提供了巨大的便利,如微信带给人们的视频资源、淘宝带给人们便利的购物等,但这些APP都需要有一个账户才可以登录,而账户需要注册可以获取。

本例要求编写一个程序,模拟用户注册。用户输入用户名、密码、确认密码、生日(格式为yyyy--mm—dd为正确)、手机号(手机号长度为11位,并且以13、15、17、18为开头的手机号为正确)、邮箱(包含符号“@”为正确)信息之后,判断信息正确后,验证用户是否重复,重复则给出相应提示,如果不重复则注册成功。案例要求使用HashSet集合实现。

2.运行结果

任务运行结果如图:

 【案例任务】

  1. 学会分析“模拟微信用户注册”任务的实现思路。
  2. 根据思路独立完成“模拟微信用户注册”任务的源代码编写、编译及运行。
  3. 掌握HashSet集合常用方法的使用及存储数据的流程。

【案例思路】

(1) 为了便于存储用户的信息。需要创建一个用户类,在类中重写其中的HashCode()方法,令其返回用户的额哈希值,再重写equals()方法,来比较对象的用户属性是否相等。

(2) 创建一个用户注册类来模拟用户注册信息,该类中可以用HashSet集合创建一个数据列表,然后向列表中添加两条初始用户信息。

(3) 从控制台获取用户填写信息,通过Scanner类的nextline()方法实现,获取后,需要将获取的数据进行校验。

(4) 单独创建一个校验类,在该类中实现校验用户输入信息的方法。校验结束后,如果效验结果错误就直接返回错误信息,这里可以分别声明一个校验结果的变量和一个校验状态的变量。校验结果变量用于存储提示信息,校验状态变量用于存储结果的判断标识。

(5) 当用户输入的信息不满足规定的格式时,需要修改变量的状态并且存储错误信息。

(6) 判断校验状态,如果所有信息都通过校验,则将用户信息创建为用户对象,通过将对象添加到用户列表返回结果来判断用户是否重复,并记录下返回结果信息。

【案例实现】

(1)创建用户类,并重写其HashCode()和equals()方法,其代码具体如文件6-3-1所示。

文件6-1  User.java

package com.itheima.shiyan6_3;
import java.util.Date;
//用户信息
public class User {
private String userName; // 用户名
private String password; // 密码
private Date birthday; // 生日
private String telNumber; // 手机号码
private String email; // 邮箱
public User() {
}
public User(String userName, String password, Date birthday,
String telNumber, String email) {
this.userName = userName;
this.password = password;
this.birthday = birthday;
this.telNumber = telNumber;
this.email = email;
}
// 重写hashCode与equals方法
@Override
public int hashCode() {// 重写hashCode方法,以用户名作为是否重复的依据
return userName.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {// 判断是否是同一个对象
return true;// 如果是同一个对象,直接返回true
}
if (obj == null) {// 判断这个对象是否为空
return false;// 如果对象是空的,直接返回false
}
if (getClass() != obj.getClass()) {// 判断这个对象是否是User类型
return false;// 如果不是,直接返回false
}
User other = (User) obj;// 将对象强转为User类型
if (userName == null) {// 判断集合中用户名是否为空
if (other.userName != null) {// 判断对象中的用户名是否为空
// 如果集合中用户名为空并且对象中用户名不为空,则返回false
return false;
}
// 判断用户名是否相同
} else if (!userName.equals(other.userName)) {
return false;// 如果不同,返回false
}
return true;
}
}

在文件6-1中创建了一个用户类,在代码22~24行代码中重写了HashCode()方法,使其返回userName属性的哈希值,并且在代码26~47行重写了equals()方法用于比较对象userName的属性是否相等,并返回结果。

(2)创建用户注册类,模拟注册信息,其代码如文件6-2所示。

文件6-2  UserRegister.java

  1. package com.itheima.shiyan6_3;
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Scanner;
    public class UserRegister {
    public static HashSet<User> USER_DATA = new HashSet<User>(); // 用户数据
    public static void main(String[] args) {
    initData();// 初始化人员信息
    Scanner scan = new Scanner(System.in);
    System.out.print("请输入用户名:");
    String userName = scan.nextLine();// 获取用户名
    System.out.print("请输入密码:");
    String password = scan.nextLine();// 获取密码
    System.out.print("请重复密码:");
    String repassword = scan.nextLine();// 获取重复密码
    System.out.print("出生日期:");
    String birthday = scan.nextLine();// 获取出生日期
    System.out.print("手机号码:");
    String telNumber = scan.nextLine();// 获取手机号码
    System.out.print("电子邮箱:");
    String email = scan.nextLine();// 获取电子邮箱
    // 校验用户信息,返回登录状态信息
    CheckInfo checkInfo = new CheckInfo(USER_DATA);
    String result = checkInfo.checkAction(userName, password,
                                 repassword, birthday, telNumber, email);
    System.out.println("注册结果:" + result);
    }
    // 初始化数据,创建两个已存在的用户信息
    private static void initData() {
    User user = new User("迪丽热巴", "zz,123", new Date(),
    "18810319240", "zhangzheng@itcast.cn");
    User user2 = new User("吴宣仪", "zq,123", new Date(),
    "18618121193", "zhouqi@itcast.cn");
    USER_DATA.add(user);
    USER_DATA.add(user2);
    }
    }

在文件6-2中,程序首先会执行第29~36行代码的initData()方法,创建“迪丽热巴”和“吴宣仪”两位用户,并将其放入到用户数据列表中,然后执行9~25行代码,获取输入的信息并将其传入CheckInfo类的checkAction()方法对输入信息进行校验。最后将结果输出。

(3)创建校验信息类,其代码如文件6-3所示。

文件6-3 CheckInfo.java

  1. package com.itheima.shiyan6_3;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashSet;
    public class CheckInfo {
    public static HashSet<User> USER_DATA = new HashSet<User>(); // 用户数据
    public CheckInfo(HashSet<User> USER_DATA) {
    this.USER_DATA = USER_DATA;
    }
    // 校验用户信息,返回登录状态信息
    public String checkAction(String userName, String password,
         String rePassword,String birthday, String phone, String email) {
    StringBuilder result = new StringBuilder();
    // 1代表成功 2代表失败
    int state = 1;
    // 密码判断
    if (!password.equals(rePassword)) {// 判断密码和重复密码是否相同
    result.append("两次输入密码不一致!\r\n");
    state = 2;
    }
    // 生日判断
    if (birthday.length() != 10) {// 字符串长度不为10,则认为格式错误
    result.append("生日格式不正确!\r\n");
    state = 2;
    } else {
    for (int i = 0; i < birthday.length(); i++) {
    Character thisChar = birthday.charAt(i);
    if (i == 4 || i == 7) {
                  if (!(thisChar == '-')) {// 验证第4位和第7位是否是
                                                             符号“-”
    result.append("生日格式不正确!\r\n");
    state = 2;
    }
    } else {// 验证除了第4位和第7位的字符是否是0~9的数字
    if (!(Character.isDigit(thisChar))) {
    result.append("生日格式不正确!\r\n");
    state = 2;
    }
    }
    }
    }
    // 手机号判断
             // 判断手机号长度不等于11位则认为此手机号无效
    if (phone.length() != 11) {
    result.append("手机号码不正确!\r\n");
    state = 2;
    // 默认有效手机号为13、15、17和18开头的手机号
    } else if (!(phone.startsWith("13") || phone.startsWith("15")
    || phone.startsWith("17") || phone.startsWith("18"))){
    result.append("手机号码不正确!\r\n");
    state = 2;
    }
    // 邮箱判断
             // 判断邮箱地址,默认不带@符号的邮箱为无效邮箱
    if (!email.contains("@")) {
    result.append("邮箱不正确!\r\n");
    state = 2;
    }
    // 如果以上信息校验无误,则将新用户加入到集合
    if (state == 1) {
    // 格式化日期返回Date对象
                  //定义日期格式
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date dateBirthday = null;
    try {
                       // 将生日格式化成日期格式
    dateBirthday = format.parse(birthday);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    User newUser = new User(userName, rePassword,
                                               dateBirthday, phone, email);
    // 将用户添加到列表中,同时可根据HashSet判断出用户名有没有重复
    if (!USER_DATA.add(newUser)) {
    result.append("用户重复!");
    state = 2;
    }
    if (state == 1) {
    result.append("注册成功!");
    }
    }
    return result.toString();
    }
    }

在文件6-3中,当主程序调用该类中的checkAction()方法后,第19~60行代码会校验用户填写的信息,所有校验通过后,将信息创建成User对象,通过第74~75行的代码,判断用户名的哈希值是否相等。相等则添加失败,反之则成功,返回结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值