Set集合

33 篇文章 0 订阅
30 篇文章 0 订阅

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;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值