Set集合:
Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素。
Set 接口存储一组唯一,无序的对象。
HashSet:底层数据结构是哈希表,该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
HashSet 保证元素唯一性:是靠元素重写hashCode()和equals()方法来保证的,如果不重写则无法保证。
例:
public class MyTest1 {
public static void main(String[] args) {
HashSet<Student> set = new HashSet<>();
set.add(new Student("张三",23));
set.add(new Student("张三", 23));
set.add(new Student("李四", 24));
set.add(new Student("王五", 25));
set.add(new Student("张三", 233));
for (Student student : set) {
System.out.println(student.getName()+"=="+student.getAge());
}
}
}
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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
public int hashCode() {
return name.hashCode()+age*11;
}
@Override
public boolean equals(Object obj) {
System.out.println(this+"==="+obj);
if (this == obj) {
return true;
}
if (!(obj instanceof Student)) {
return false;
}
Student student = (Student) obj;
return this.name.equals(student.name) && this.age == student.age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
LinkedHashSet:数据结构有两个:链表和哈希表。链表保证有序,哈希表保证元素唯一。
例:
public class MyTest2 {
public static void main(String[] args)
LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(10);
set.add(20);
set.add(30);
set.add(40);
set.add(50);
set.add(60);
for (Integer integer : set) {
System.out.println(integer);
}
}
}
TreeSet:元素唯一,并且可以对元素进行排序。
元素唯一性:保证元素的唯一性,是靠compareTo方法的返回值来确定,如果返回0 表示两个元素相等,则不重复存储。
排序:
1、自然排序;(此对象 必须实现Comparable接口 否则报错)
2、使用比较器排序。
//自然排序
public class MyTest {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<>();
set.add(new Student("吕洞宾", 300));
set.add(new Student("吕洞宾2", 300));
set.add(new Student("韩湘子11", 500));
set.add(new Student("韩湘子222", 500));
set.add(new Student("蓝采和66666666", 200));
set.add(new Student("何仙姑", 600));
//按照年龄大小进行排序
//按照名字的长度来排序
for (Student student : set) {
System.out.println(student);
}
}
}
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student student) {
int num = this.age - student.age;
int num2 = num == 0 ? this.name.compareTo(student.name) : num;
return num2;
}
}
//比较器排序
public class MyTest {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getName().length() - s2.getName().length();
int num2=num==0?s1.getName().compareTo(s2.getName()):num;
int num3=num2==0?s1.getAge()-s2.getAge():num2;
return num3;
}
});
set.add(new Student("吕洞宾", 300));
set.add(new Student("吕洞宾2", 300));
set.add(new Student("韩湘子11", 500));
set.add(new Student("韩湘子222", 500));
set.add(new Student("蓝采和66666666", 200));
set.add(new Student("何仙姑", 600));
for (Student student : set) {
System.out.println(student);
}
}
}
用户登录:
package com.view.cn;
import com.dao.cn.UserDao;
import com.dao.cn.UserDaoImpl;
import com.game.cn.GuessNumber;
import com.yonghu.cn.user;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
//1.当用户输入的类型,不正确时,程序不能挂掉,得提示用户输入的类型不正确,请重新输入
//2.登录只给3次机会,还得提示剩余次数
//3.对用户名进行正则检验 用户名名的规则 6-16字母大小写都可以 密码 6-16位数字
Scanner sc= new Scanner(System.in);
UserDaoImpl userDao = new UserDaoImpl();
while (true){
for (int j = 1; j !=0 ; j++) {
System.out.println("请输入选项,1:注册;2:登录;3:退出");
String n=sc.nextLine();
String Regx="[123]{1}";
sc=new Scanner(System.in);
boolean A=n.matches(Regx);
if (A){
int m=Integer.parseInt(n);
switch (m){
case 1:
//注册
user user1 = new user();
for (int i = 1; i !=0 ; i++) {
System.out.println("请输入用户名");
String username = sc.nextLine();
String regx = "[a-zA-Z]{5,15}";
boolean a = username.matches(regx);
if (a) {
user1.setUsername(username);
break;
} else {
System.out.println("请输入6~16位大写或小写字母");
}
}
for (int i = 1; i !=0 ; i++) {
System.out.println("请输入密码");
String password=sc.nextLine();
String regx1="[1-9][0-9]{4,15}";
boolean b=password.matches(regx1);
if (b){
user1.setPassword(password);
break;
}else{
System.out.println("请输入6~16位数字");
}
}
userDao.register(user1);
System.out.println("注册成功");
break;
case 2:
//登录
for (int i = 3; i >0 ; i--) {
System.out.println("请输入用户名");
String username1=sc.nextLine();
System.out.println("请输入登录密码");
String password1=sc.nextLine();
boolean c=userDao.login(username1,password1);
if (c){
System.out.println("登录成功");
System.out.println("玩游戏吗?y/n");
while (true){
String S=sc.nextLine();
if (S.equalsIgnoreCase("y")){
GuessNumber.playGame();
System.out.println("还要玩吗?y/n");
}else{
System.exit(0);
}
}
}else{
System.out.println("登录失败,您还有"+(i-1)+"次机会");
}
}
break;
case 3:
//退出
default:
System.exit(0);
break;
}
break;
}else{
System.out.println("请输入正确格式 ");
}
}
}
}
}
//接口
package com.dao.cn;
import com.yonghu.cn.user;
public interface UserDao {
//注册
public abstract void register(user user);
//登录
public abstract boolean login(String username, String password);
}
package com.dao.cn;
import com.yonghu.cn.user;
import java.util.ArrayList;
public class UserDaoImpl implements UserDao {
static ArrayList<user> list = new ArrayList<>();
@Override
public void register(user user) {
list.add(user);
}
@Override
public boolean login(String username, String password) {
boolean flag=false;
for (user user : list) {
if (user.getUsername().equals(username)&&user.getPassword().equals(password)){
flag=true;
}
} return flag;
}
}
//小游戏
package com.game.cn;
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
public static void playGame(){
Random random = new Random();
int num= random.nextInt(100)+1;
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入一个数字 1----100");
int guessNumber = sc.nextInt();
if (guessNumber > num) {
System.out.println("猜大了");
} else if (guessNumber < num) {
System.out.println("猜小了");
} else if (guessNumber == num) {
System.out.println("恭喜你猜对了");
break;
}
}
}
}
//用户
package com.yonghu.cn;
public class user {
private String username;
private String password;
public user() {
}
public user(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}