import java.util.ArrayList;
import java.util.Random;
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Random r = new Random();
int count = 0;
while (count<10){
int num = r.nextInt(50)+1;
if(!list.contains(num)){
list.add(num);
count++;
}
}
System.out.println(list);
}
}
package com.momo.demo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
Scanner sc = new Scanner(System.in);
while (true){ System.out.println("请输入:"); int i = sc.nextInt(); if(i==0){ break; }else{ list.add(i); } } Integer[] array = list.toArray(new Integer[1]); System.out.println(Arrays.toString(array)); Arrays.sort(array); System.out.println(Arrays.toString(array)); System.out.println(array[array.length-1]); }
}
集合版模拟用户注册登录案例
package com.momo.demo;
import com.momo.po.User;
import com.momo.service.UserService;
import com.momo.service.imp.UserServiceImp;
import com.momo.util.Game;
import java.util.Scanner;
/*
- 模拟用户注册登录,登录成功之后实现增删改查
- 分析:面向对象思想
- 有哪些类?
- 用户类
- 用户信息:id,name,gender,bir,account,password,... 构造方法,get和set,toString, eat,sleep...
- 登录功能
- 注册功能
- .....
- 如果用户类的内容很多,将来维护的时候就比较麻烦了,所以为了更加清晰的分析,我们可以把用户类分成2个类
- 用户基本类
- 成员变量,构造方法,成员方法
- 用户操作类
- 登录功能
- 注册功能
- .....
- 测试类
- main
- 每个类中有什么内容?
- 类和类之间的关系是什么?
- */
public class Demo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("欢迎你访问xxxxxx系统");
System.out.println("--------------------------------");
UserService us = new UserServiceImp();
while (true) {
System.out.println("请选择:1--注册 2--登录 3--退出");
String i = sc.nextLine(); switch (i) { case "1": { System.out.println("注册页面"); System.out.println("编号:"); int id = Integer.parseInt(sc.nextLine()); System.out.println("姓名:"); String name = sc.nextLine(); System.out.println("账号:"); String account = sc.nextLine(); System.out.println("密码:"); String password = sc.nextLine(); boolean boo = us.regist(new User(id, name, account, password)); if (boo) { System.out.println("注册成功。。。。"); } else { System.out.println("注册失败。。。。"); } break; } case "2": { System.out.println("登录页面"); System.out.println("账号:"); String account = sc.nextLine(); System.out.println("密码:"); String password = sc.nextLine(); boolean boo = us.login(account, password); if (boo) { System.out.println("登录成功。。。。欢迎你:"+account); System.out.println("---------------------------"); while (true) { System.out.println("要开始游戏吗?y/n"); String s = sc.nextLine(); if(s.equals("y")){ System.out.println("游戏开始!"); //玩游戏 Game.start(); } else if (s.equals("n")) { break; }else{ System.out.println("输入有误。。。"); } // System.out.println("1--查询 2--新增 3--修改 4--删除 5--退出"); } } else { System.out.println("登录失败。。。。"); } break; } case "3": System.out.println("欢迎下次再来,请慢走。。。"); System.exit(0); break; default: System.out.println("没有该选项!"); break; } }
}
}
package com.momo.service;
import com.momo.po.User;
//用户操作类接口
public interface UserService {
//注册
public abstract boolean regist(User u);
//登录
public abstract boolean login(String account,String password);
}
package com.momo.service.imp;
import com.momo.po.User;
import com.momo.service.UserService;
import java.util.ArrayList;
//用户操作类
public class UserServiceImp implements UserService {
private ArrayList list = new ArrayList<>();
//private static ArrayList list = new ArrayList<>();
//注册
public boolean regist(User u){
// ArrayList list = new ArrayList<>();
// return list.add(u);
boolean boo = list.add(u);
System.out.println(list);
return boo;
}
//登录 public boolean login(String account,String password){ boolean boo = true; for (User user : list) { if(user.getAccount().equals(account)&&user.getPassword().equals(password)){ boo = true; break; }else{ boo = false; } } return boo; }
}
package com.momo.po;
import java.util.Objects;
//用户基本类
public class User {
private int id;
private String name;
private String account;
private String password;
public User() {} public User(int id, String name, String account, String password) { this.id = id; this.name = name; this.account = account; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", account='" + account + '\'' + ", password='" + password + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return id == user.id && Objects.equals(name, user.name) && Objects.equals(account, user.account) && Objects.equals(password, user.password); } @Override public int hashCode() { return Objects.hash(id, name, account, password); }
}
package com.momo.util;
import java.util.Random;
import java.util.Scanner;
public class Game {
private Game(){}
public static void start(){
Scanner sc = new Scanner(System.in);
Random r = new Random();
int i = r.nextInt(100)+1;
while (true) {
System.out.println("请输入:(1-100)");
int j = sc.nextInt();
if (i == j) {
System.out.println("猜对了,请去前台领取奖品");
break;
} else if (i > j) {
System.out.println("小了");
} else {
System.out.println("大了");
}
}
}
}
一,Set
1,概述
不包含重复元素的集合,并且最多一个空元素。
2,特点
-无序,唯一
3,成员方法
-都是讲过的
package com.momo.demo;
import java.util.HashSet;
import java.util.Set;
public class Demo3 {
public static void main(String[] args) {
/* Set s = new HashSet();
s.add("aaa");
s.add("bbb");
s.add("ccc");
s.add(null);*/
/s.add("bbb");s.add("ccc");s.add(null);/
/* for (Object o : s) { System.out.println(o); }*/ Set<String> s = new HashSet<>(); s.add("aaa"); s.add("bbb"); s.add("ccc"); for (String ss : s) { System.out.println(ss); } }
}
4,练习
-存储字符串遍历
-存储自定义对象遍历
package com.momo.demo;
import com.momo.po.Stu;
import java.util.HashSet;
import java.util.Set;
/*
- 我们按照和字符串一样的思路,存储了自定义对象,但是这次并没有去掉重复内容
- 为什么?
- 我们简单的查看了一下原码,发现原码中使用了equals方法进行对比,字符串重写过equals方法,比较的是内容
- 而自定义对象我们没有重写,默认使用Object的(用的是==) ,== 引用类型比较的是地址值,对象都是new的
- 地址值肯定不一样,所以,使用Set集合存储自定义对象时,一定记住要重写equals方法
- */
public class Demo4 {
public static void main(String[] args) {
Set s = new HashSet<>();
s.add(new Stu("默默",18));
s.add(new Stu("三藏",26));
s.add(new Stu("悟空",800));
s.add(new Stu("八戒",1000));
s.add(new Stu("悟净",1500));
s.add(new Stu("默默",18));
s.add(new Stu("悟空",800));
for (Stu stu : s) { System.out.println(stu.getName()+"---"+stu.getAge()); }
}
}
二,HashSet
1,概述
-此类实现Set接口,由哈希表(实际为HashMap实例)支持。
-对集合的迭代次序不作任何保证; 特别是,它不能保证元素
在一段时间内保持不变。 这个类允许null元素。
2,特点
-底层数据结构是 哈希表(元素是链表的数组,结合了数组和链表的优势)
哈希表依赖哈希值,添加功能依赖 hashCode和equals方法
-无序,唯一,允许为空(只能有一个)
-此实现不同步,线程不安全,效率高
3,构造方法
HashSet()
构造一个新的空集合
HashSet(Collection c)
构造一个包含指定集合中的元素的新集合。
HashSet(int initialCapacity)
构造一个新的空集合; 背景HashMap实例具有指定的初始容量
4,成员方法
-常用的都是讲过的
5,练习
-使用HashSet集合存储字符串,自定义对象遍历(加泛型)
三,LinkedHashSet
1,概述
-哈希表和链表实现了Set接口,具有可预测的迭代次序。
-此实现不同步。
2,特点
-有序(存储顺序),唯一
3,构造方法
LinkedHashSet()
构造一个具有默认初始容量(16)和负载因子(0.75)的新的,空的链接散列集。
LinkedHashSet(Collection c)
构造与指定集合相同的元素的新的链接散列集。
LinkedHashSet(int initialCapacity)
构造一个具有指定初始容量和默认负载因子(0.75)的新的,空的链接散列集。
4,成员方法
--常用的都是讲过的
5,练习
-使用LinkedHashSet集合存储字符串,自定义对象遍历(加泛型)
package com.momo.demo;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class Demo5 {
public static void main(String[] args) {
LinkedHashSet s = new LinkedHashSet<>();
// s.add("bbb");
s.add("ccc");
s.add("bbb");
s.add("aaa");
for (String ss : s) {
System.out.println(ss);
}
}
}
四,TreeSet
1,概述
-一个可以排序的集合,排序有2种方式:
自然排序
比较器排序
取决于创建对象时采用的构造方法
2,特点
-唯一,排序,不能为空
-此实现不同步。
3,构造方法
TreeSet()
构造一个新的,空的树组,根据其元素的自然排序进行排序。
TreeSet(Collection c)
构造一个包含指定集合中的元素的新树集,根据其元素的 自然排序进行排序 。
TreeSet(Comparator comparator)
构造一个新的,空的树集,根据指定的比较器进行排序。
package com.momo.demo;
import java.util.ArrayList;
import java.util.TreeSet;
public class Demo6 {
public static void main(String[] args) {
//无参构造,表示使用自然排序对元素进行排序
// TreeSet ts = new TreeSet<>();
ArrayList ts = new ArrayList<>();
ts.add(54);
ts.add(23);
ts.add(345);
ts.add(1);
ts.add(23);
ts.add(54);
ts.add(11);
// ts.add(null);
//ts.add(null);
// System.out.println(ts);
for (Integer t : ts) {
System.out.println(t);
}
System.out.println("------------");
TreeSet tt = new TreeSet<>(ts);
for (Integer it : tt) {
System.out.println(it);
}
}
}
4,TreeSet是如何保证排序和唯一的
-底层数据结构是 二叉树
当我们添加的时候,拿第一个元素放到根节点
从第二个元素开始,都要和之前的元素进行比较,小的放左边,大的放右边
一样的进行替换,这样就可以保证唯一
我们在获取元素的时候,是按照左中右的顺序的获取元素,保证排序
-通过简单查看源码,我们发现TreeSet的add方法实际上调用的是
TreeMap中的put方法做的添加,在这个方法中,有2中比较方式。
一:通过传递的比较器排序, Comparator接口中的compare方法进行比较
二:使用自然排序,会使用Comparable接口中的compareTo方法进行比较
要进行自然排序,元素对应的类必须实现自然排序接口
Comparable,重写compareTo方法,会把元素强转成Comparable类型
-第一个案例存储的是Integer类型数据,Integer类已经实现了Comparable接口,
也重写了compareTo方法。所以可以直接进行自然排序
-第二个案例存储的是自定义对象,刚开始并没有实现Comparable接口,
所以在源码中转换的时候就报错了 ClassCastException 类型转换异常
注意:存储自定义对象时,要进行自然排序,必须实现该接口,重写该方法
方法中要如何进行比较,是我们自定义的。
package com.momo.demo;
import java.util.ArrayList;
import java.util.TreeMap;
import java.util.TreeSet;
public class Demo6 {
public static void main(String[] args) {
//无参构造,表示使用自然排序对元素进行排序
TreeSet ts = new TreeSet<>();
// ArrayList ts = new ArrayList<>();
ts.add(54);
ts.add(23);
ts.add(345);
ts.add(1);
ts.add(23);
ts.add(54);
ts.add(11);
// ts.add(null);
//ts.add(null);
// System.out.println(ts);
for (Integer t : ts) {
System.out.println(t);
}
/*System.out.println("------------");
TreeSet tt = new TreeSet<>(ts);
for (Integer it : tt) {
System.out.println(it);
}
*/
}
}
package com.momo.demo;
import com.momo.po.Stu;
import java.util.TreeSet;
/*
- 按照和刚才一样的方式,存储了自定义对象,但是这次报错了
- ClassCastException 类型转换异常
- com.momo.po.Stu cannot be cast to class java.lang.Comparable
- 说明了,自定义对象要进行自然排序,必须实现自然排序接口,重写compareTo 方法
- Comparable:接口,自然排序接口
- int compareTo(T o) 将此对象与指定的对象进行比较以进行排序。
- */
public class Demo7 {
public static void main(String[] args) {
// //无参构造,表示使用自然排序对元素进行排序
TreeSet ts = new TreeSet<>();
ts.add(new Stu("默默",18));
ts.add(new Stu("三藏",26));
ts.add(new Stu("悟空",800));
ts.add(new Stu("八戒",1000));
ts.add(new Stu("悟净",1500));
ts.add(new Stu("默默",18));
ts.add(new Stu("悟空",800));
for (Stu t : ts) { System.out.println(t); }
}
}
package com.momo.po;
import java.util.Objects;
public class Stu implements Comparable{
private String name;
private Integer age;
public Stu() {} public Stu(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Stu stu = (Stu) o; if (!Objects.equals(name, stu.name)) return false; return Objects.equals(age, stu.age); } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (age != null ? age.hashCode() : 0); return result; } @Override public String toString() { return "Stu{" + "name='" + name + '\'' + ", age=" + age + '}'; } //比什么?怎么比?这是由我们自己定义的 @Override public int compareTo(Stu o) { //先比哪个?后比哪个? //以年龄为主要条件 int i = this.age-o.age; //年龄一样,还要比较姓名 int ii = i==0?this.name.compareTo(o.name):i; return ii; }
}
package com.momo.demo;
import com.momo.po.Stu;
import java.util.TreeSet;
/*
- 存储自定义对象,按照姓名长度进行排序
- */
public class Demo8 {
public static void main(String[] args) {
TreeSet ts = new TreeSet<>();
ts.add(new Stu("momo",18));
ts.add(new Stu("xiaobao",20));
ts.add(new Stu("xiaolong",30));
ts.add(new Stu("dilireba",28));
ts.add(new Stu("hani",26));
for (Stu t : ts) { System.out.println(t); }
}
}
package com.momo.po;
import java.util.Objects;
public class Stu implements Comparable{
private String name;
private Integer age;
public Stu() {} public Stu(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Stu stu = (Stu) o; if (!Objects.equals(name, stu.name)) return false; return Objects.equals(age, stu.age); } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (age != null ? age.hashCode() : 0); return result; } @Override public String toString() { return "Stu{" + "name='" + name + '\'' + ", age=" + age + '}'; } //姓名长度, 主要条件 @Override public int compareTo(Stu o) { //姓名长度 int i = this.name.length()-o.name.length(); //姓名内容 int ii=i==0?this.name.compareTo(o.name):i; //年龄 int iii=ii==0?this.age-o.age:ii; return iii; }
/*//比什么?怎么比?这是由我们自己定义的 @Override public int compareTo(Stu o) { //先比哪个?后比哪个? //以年龄为主要条件 int i = this.age-o.age; //年龄一样,还要比较姓名 int ii = i==0?this.name.compareTo(o.name):i; return ii; }*/ }
package com.momo.demo;
import com.momo.po.MyComparator;
import com.momo.po.Stu;
import com.momo.po.Tea;
import java.text.ParseException;
import java.text.RuleBasedCollator;
import java.util.Comparator;
import java.util.TreeSet;
/*
- 存储自定义对象,进行比较器排序
- Comparator 比较器 接口
- int compare(T o1, T o2) 比较其两个参数的顺序。
应该传递该接口的具体实现类对象,比较规则是我们自定义的,所以我们要自己编写实现类,
- 重写compare方法,自己定义我们的比较规则
- /
public class Demo9 {public static void main(String[] args) throws ParseException {//传递比较器,通过比较器排序,按照姓名长度排序(按照年龄排序,...)/ TreeSet ts = new TreeSet<>(new MyComparator());
ts.add(new Tea("momo",18));
ts.add(new Tea("xiaobao",20));
ts.add(new Tea("xiaolong",30));
ts.add(new Tea("dilireba",28));
ts.add(new Tea("hani",26));*/
//匿名内部类来改进代码 /*TreeSet<Tea> ts = new TreeSet<>(new Comparator<Tea>() { @Override public int compare(Tea o1, Tea o2) { int i = o2.getName().length()-o1.getName().length(); int i2 = i==0?o1.getName().compareTo(o2.getName()):i; int i3 = i2==0?o2.getAge()-o1.getAge():i2; return i3; } });*/ //使用lamada表达式改进 TreeSet<Tea> ts = new TreeSet<>((o1, o2) -> { int i = o2.getName().length()-o1.getName().length(); int i2 = i==0?o1.getName().compareTo(o2.getName()):i; int i3 = i2==0?o2.getAge()-o1.getAge():i2; return i3; }); ts.add(new Tea("momo",18)); ts.add(new Tea("xiaobao",20)); ts.add(new Tea("xiaolong",30)); ts.add(new Tea("dilireba",28)); ts.add(new Tea("hani",26)); for (Tea t : ts) { System.out.println(t); }
}
}
package com.momo.po;
import java.util.Comparator;
//自定义类,实现比较器排序接口,重写方法。
public class MyComparator implements Comparator {
@Override
public int compare(Tea o1, Tea o2) {
int i = o2.getName().length()-o1.getName().length();
int i2 = i==0?o1.getName().compareTo(o2.getName()):i;
int i3 = i2==0?o2.getAge()-o1.getAge():i2;
return i3;
}
}
package com.momo.po;
import java.util.Objects;
public class Tea{
private String name;
private Integer age;
public Tea() {} public Tea(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Tea{" + "name='" + name + '\'' + ", age=" + age + '}'; }
}
5,函数式接口
-接口上有这个注解(@FunctionalInterface)的接口就叫做函数式接口
-特点:
可以使用lambda表达式来简化
只有一个抽象方法
@FunctionalInterface
public interface Comparator
package com.momo.service;
@FunctionalInterface
public interface Inter {
void show();
// void fun();
}
package com.momo.demo;
import com.momo.service.Inter;
public class Demo10 {
public static void main(String[] args) {
/* new Inter(){
@Override
public void show() {
System.out.println("aaa");
}
}.show();
((Inter)()-> System.out.println("bbb")).show();}*/ }
}
6,练习
-获取10个1-50随机数,要求不能重复
-键盘输入几个学生信息(科目成绩),按照总成绩从高到低排序