集合
集合是一种容器,储存数据,类似于数组
但集合大小可变,开发中更多
ArrayList类(需要导包)
底层数组装不下后自动扩容出一个新数组,将数据转移
集合和数组的使用选择
数组:存储的元素个数固定不变
集合:存储的元素个数经常发生改变
构造方法
public ArrayList() 创建空集合容器
ArrayList List = new ArrayList(); //可以添加任意类型
list.ad("张三");
List.add("李四");
list.add("王五");
ArrayList<String> list = new ArrayList<String>(); //<>内可以限定数据类型
成员方法
- 增:
public boolean add(E e) :将指定的元素添加到此列表的尾部
public void add(int index, E element) :在指定索引位置,添加对应的元素(插队)
- 删
public E remove(int index) :根据索引做删除,返回被删除掉的元素
public boolean remove(0bject o) :根据元素做删除,返回是否删除成功的状态
- 改
public E set(int index, E element) :修改指定索引位置,为对应的元素,返回被覆盖掉的元素
以上方法,返回值通常不做接收
- 查
public E get(int index) : 根据索引,获取集合中的元素
public int size() : 返回集合中元素的个数.
/*
需求:创建一个存储String的集合,内部存储(test, 张三,李四,test, test)字符串
删除所有的test字符串,删除后,将集合剩余元素打印在控制台
*/
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("test");
list.add("张三");
list.add("李四");
list.add("test");
list.add("test");
for (int i = 0; i<list.size();i++) {
String s = list.get(i);
if("test".equals(s)){
list.remove(i);
i--; //做筛查删减案例时,由于集合的自动补缺性质,1)每删除成功一个元素索引要-1
}
}
for(int i =list.size()-1;i>=0;i--){ // 2)倒着遍历集合
String s = list.get(i);
if("test".equals(s)){
list.remove(i) ;
}
}
}
签到系统案例(完成第三周作业时使用集合编写的初步代码)
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Scanner;
public class AppUse {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<People> list= new ArrayList<>(); //签到、签退、查看都围绕集合操作
lo:
while (true) {
System.out.println("--------欢迎来到签到系统--------");
System.out.println("请输入当前所需操作");
System.out.println("1.签到 2.签退 3.查看签到表 4.退出系统:/请输入你的选择");
String option = sc.next();
switch (option) {
case "签到":
signIn(list);
break;
case "签退":
signOut(list);
break;
case "查看签到表":
showList(list);
break;
case "退出系统":
System.out.println("感谢您的使用,再见。");
break lo; //停止while循环
default:
System.out.println("请输入正确信息");
}
}
}
/*此方法用于录入姓名与签到时间*/
private static void signIn(ArrayList<People> list) {
//录入姓名
Scanner sc = new Scanner(System.in);
System.out.println("请输入签到姓名:");
String name1="";
while(true){//循环判断姓名是否存在
name1 = sc.next();
int index = getIndex(name1,list);
if(index==-1) {
//名字不重复,可以使用
break;
}else { //姓名以存在
System.out.println("已签到,请勿重复签到。");
}
}
//生成签到时间
LocalTime signIn = LocalTime.now();
//生成空的签出时间
LocalTime signOut = LocalTime.of(00, 00, 00);
//封装
People guy = new People(name1, signIn, signOut);
//添加进集合
list.add(guy);
System.out.println("签到成功!");
}
/*此方法用于根据名字签退及添加签退时间*/
private static void signOut(ArrayList<People> list) {
//录入名字
Scanner sc = new Scanner(System.in);
System.out.println("请输入签退姓名:");
String name2 = sc.next();
//调用getIndex方法
int index = getIndex(name2,list);
//判断是否-1,根据索引签退或抛出异常
if(index==-1){
System.out.println("查无此人,请重新输入:");
}else{
//姓名存在,根据索引添加登出时间
LocalTime signOut = LocalTime.now();
//重新获取一次签到时间以便封装
LocalTime signIn = list.get(index).getSignIn();
//将签到时间、签退时间和姓名封装为People对象
People guy = new People(name2,signIn,signOut);
//修改集合中的元素为新封装的guy
list.set(index,guy);
System.out.println("签退成功!");
}
}
/*此方法用于查看签到表*/
private static void showList(ArrayList<People> list) {
if(list.size()==0){
System.out.println("查无信息");
}else {
System.out.println("姓名\t\t\t签到时间\t\t\t\t签退时间\t\t\t\t历经时长");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getName()
+"\t\t\t"+list.get(i).getSignIn()
+"\t\t"+list.get(i).getSignOut());
}
}
}
/*此方法用于根据姓名查找索引*/
private static int getIndex(String name,ArrayList<People> list) {
//遍历集合,获取每一个姓名
for (int i = 0; i < list.size(); i++) {
People guy = list.get(i);
//对比取出的姓名和要查找的姓名
if (guy.getName().equals(name)) {
//找到了
return i;
}
}
//没找到,返回-1
return -1;
}
}
import java.time.LocalTime;
public class People {
private String name; //用新版时间类操作,最后需要类型转换
private LocalTime signIn; //签退时间 同上
private LocalTime signOut;
public People(String name, LocalTime signIn, LocalTime signOut) {
this.name = name;
this.signIn = signIn;
this.signOut = signOut;
}
public String getName() {
return name;
}
public LocalTime getSignIn() {
return signIn;
}
public LocalTime getSignOut() {
return signOut;
}
/**
* 使用构造方法完成对象初始化或者getter和setter方法初始化对象都可以
*/
}