1.集合基础
1.1 集合概述
编程的时候如果要存储多个数据,使用长度固定的数组存储格式,不一定满足我们的需求,更适应不了变化的需求,那么此时该如何选择?——可以考虑使用集合
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
集合类有很多,目前我们先学习一个:ArrayList
ArrayList
- 可调整大小的数组实现
:是一种特殊的数据类型,泛型。
怎么用?
- 在出现E的地方我们使用引用数据类型替换即可,举例:ArrayList
,ArrayList
1.2 ArrayList构造方法和添加方法
package com.szy006;
import java.util.ArrayList;
/*
ArrayList 构造方法:
public ArrayList():创建一个空的对象集合
ArrayList 添加方法:
public boolean add(E e):将指定元素追加到此集合的末尾
public void add(int index,E element):在此集合中的指定位置插入指定的元素
*/
public class ArrayListDemo01 {
public static void main(String[] args) {
//public ArrayList():创建一个空的对象集合
//ArrayList<String> array=new ArrayList<>();也可以
ArrayList<String> array=new ArrayList<String>();
//public boolean add(E e):将指定元素追加到此集合的末尾
//System.out.println(array.add("hello"));判断是否添加元素成功
array.add("hello");
array.add("world");
array.add("java");
//public void add(int index,E element):在此集合中的指定位置插入指定的元素
array.add(1,"home");//在1索引位置添加home
array.add(3,"work");//在3索引位置添加work
array.add(5,"fish");//在5索引位置添加fish
array.add(7,"bug");//在5索引位置添加bug,报错IndexOutOfBoundsException
//输出集合
System.out.println("array:"+array);
}
}
1.3 ArrayList集合常用方法
package com.szy006;
import java.util.ArrayList;
/*
ArrayList常用方法:
public boolean remove(Object o):删除指定的元素,返回删除是否成功
public E remove(int index):删除指定索引处的元素,返回被删除的元素
public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
public E get(int index):返回集合中指定索引处的元素
public int size():返回集合中元素的个数
*/
public class ArrayListDemo02 {
public static void main(String[] args) {
ArrayList array=new ArrayList<>();//创建空的对象集合
//添加元素
array.add("hello");
array.add("world");
array.add("java");
/*public boolean remove(Object o):删除指定的元素,返回删除是否成功
System.out.println(array.remove("hello"));*/
/*public E remove(int index):删除指定索引处的元素,返回被删除的元素
System.out.println(array.remove(1));
*/
/*public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
System.out.println(array.set(2,"job"));
*/
/*public E get(int index):返回集合中指定索引处的元素
System.out.println(array.get(0));
System.out.println(array.get(1));
System.out.println(array.get(2));
System.out.println(array.get(3));//报错,超出索引范围
*/
//public int size():返回集合中元素的个数
System.out.println(array.size());
System.out.println("array:"+array);//输出集合
}
}
案例:存储字符串并遍历
需求:创建一个存储字符串的集合,存储3个字符串元素,使用程序实现控制台遍历该集合
package com.szy006;
import java.util.ArrayList;
public class ArrayListDemo03 {
public static void main(String[] args) {
ArrayList<String> array=new ArrayList<String>();
array.add("long");
array.add("big");
array.add("small");
for(int i=0;i<array.size();i++){
System.out.println(array.get(i));
}
}
}
案例1:存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
package com.szy006;
import java.util.ArrayList;
public class StudentArray {
public static void main(String[] args) {
ArrayList<Student> array=new ArrayList<Student>();//创建集合对象
//创建学生对象
Student s1=new Student("魈",21);
Student s2=new Student("胡桃",20);
Student s3=new Student("钟离",40);
//添加学生对象到集合中
array.add(s1);
array.add(s2);
array.add(s3);
//遍历集合
for(int i=0;i<array.size();i++){
Student s=array.get(i);
System.out.println("姓名:"+s.getName()+",年龄:"+s.getAge());
}
}
}
案例2:录入学生对象并遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合学生的姓名和年龄来自于键盘录入。
package com.szy007;
import java.util.Scanner;
import java.util.ArrayList;
public class StudentDemo {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> array=new ArrayList<>();
/*
//键盘录入学生信息
Scanner sc=new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入年龄:");
int age=sc.nextInt();
//创建学生对象,并把输入的数据赋值给学生对象
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
//往集合中添加学生对象
array.add(stu);
*/
//为了提高代码的复用性,我们用方法来改进程序
AddStudent(array);
AddStudent(array);
AddStudent(array);
for(int i=0;i<array.size();i++){
Student stu=array.get(i);
System.out.println("姓名:"+stu.getName()+",年龄:"+stu.getAge());
}
}
public static void AddStudent(ArrayList<Student> array){
//键盘录入学生信息
Scanner sc=new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入年龄:");
int age=sc.nextInt();
//创建学生对象,并把输入的数据赋值给学生对象
Student stu=new Student();
stu.setName(name);
stu.setAge(age);
//往集合中添加学生对象
array.add(stu);
}
}
package com.szy007;
/*
定义学生类
*/
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
}
案例3:学生管理系统
- 定义学生类
- 主界面的代码编写
- 添加学生信息的代码编写
- 查看学生信息的代码编写
- 删除学生信息的代码编写
- 修改学生信息的代码编写
package com.szy008;
/*
定义学生类
快捷键:Alt+Insert根据自己的需要生成构造方法,get方法,set方法
学号:sid
姓名:name
年龄:age
居住地:address
专业:profession
*/
public class Student {
private String sid;
private String name;
private String age;
private String address;
private String profession;
public Student(){//无参构造方法
}
//带五个参数的构造方法
public Student(String sid,String name,String age,String address,String profession){
this.sid=sid;
this.name=name;
this.age=age;
this.address=address;
this.profession=profession;
}
//每个成员变量对应给出的set/get方法
public void setSid(String sid){
this.sid=sid;//设置学号
}
public String getSid(){
return sid;//返回学号
}
public void setName(String name){
this.name=name;//设置姓名
}
public String getName(){
return name;//返回姓名
}
public void setAge(String age ){
this.age=age;//设置年龄
}
public String getAge(){
return age;//返回年龄
}
public void setAddress(String address){
this.address=address;//设置地址
}
public String getAddress(){
return address;//返回地址
}
public void setProfession(String profession){
this.profession=profession;//设置专业
}
public String getProfession(){
return profession;//返回专业
}
}
package com.szy008;
import java.util.Scanner;
import java.util.ArrayList;//导包
public class StudentManager {
public static void main(String[] args) {
ArrayList<Student> array=new ArrayList<Student>();//创建空集合对象
int num=1;
while(num!=0){
menu();
System.out.println("请输入选项:");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();//接收输入的选项
switch(a){
case 1:
addMessage(array);
break;
case 2:
printMessage(array);
break;
case 3:
removeMessage(array);
break;
case 4:
modificationMessage(array);
break;
case 5:
num=0;//退出系统
break;
default:
System.out.println("输入错误值!!!");
break;
}
}
}
public static void menu() {//主界面
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
System.out.println("---------学生信息管理系统---------");
System.out.println(" 1.添加学生信息 ");
System.out.println(" 2.查看学生信息 ");
System.out.println(" 3.删除学生信息 ");
System.out.println(" 4.修改学生信息 ");
System.out.println(" 5.退出系统 ");
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
}
public static void addMessage(ArrayList<Student> array ){//1.添加学生信息
Scanner sc=new Scanner(System.in);//创建对象,录入学生信息
System.out.println("请输入学号:");
String sid=sc.nextLine();
System.out.println("请输入姓名:");
String name=sc.nextLine();
System.out.println("请输入年龄:");
String age=sc.nextLine();
System.out.println("请输入地址");
String address=sc.nextLine();
System.out.println("请输入专业");
String profession=sc.nextLine();
Student stu=new Student();//把输入的信息赋值给学生对象
stu.setSid(sid);
stu.setName(name);
stu.setAge(age);
stu.setAddress(address);
stu.setProfession(profession);
array.add(stu);
}
public static void printMessage(ArrayList<Student> array ) {//2.查看学生信息
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
System.out.println(" 学生信息表 ");
System.out.println("序号 学号 姓名 年龄 地址 专业");
for(int i=0;i<array.size();i++){
Student stu=array.get(i);
System.out.println(" "+(i+1)+" "+stu.getSid()+" "+stu.getName()+" "+stu.getAge()+" "+stu.getAddress()+" "+stu.getProfession());
}
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
}
public static void removeMessage(ArrayList<Student> array ){//3.删除学生信息
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
System.out.println("请输入要删除学生的序号:");
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();//接收输入的学生序号
Student stu=array.remove(i-1);
System.out.println("删除的学生信息为:");
System.out.println(i+" "+stu.getSid()+" "+stu.getName()+" "+stu.getAge()+" "+stu.getAddress()+" "+stu.getProfession());
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
}
public static void modificationMessage(ArrayList<Student> array ){//4.修改学生信息
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
System.out.println("请输入要修改学生的序号:");
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();//接收输入的学生序号
sc.nextLine();//读取掉换行符
System.out.println("请输入该生修改后的信息:");
System.out.print("学号:");
String sid=sc.nextLine();
System.out.print("姓名:");
String name=sc.nextLine();
System.out.print("年龄:");
String age=sc.nextLine();
System.out.print("地址:");
String address=sc.nextLine();
System.out.print("专业:");
String profession=sc.nextLine();
Student stu=new Student(sid,name,age,address,profession);//把输入的信息赋值给学生对象
array.set(i-1,stu);
System.out.println("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
}
}
老师写的代码:
package com.szy009;
public class Student {
private String sid;//学号
private String name;//姓名
private String age;//年龄
private String address;//居住地
public Student() {
}
public Student(String sid, String name, String age, String address) {
this.sid = sid;
this.name = name;
this.age = age;
this.address = address;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package com.szy009;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentDemo {
public static void main(String[] args) {
//创建学生对象集合,用于存储学生数据
ArrayList<Student> array=new ArrayList<>();
while(true){
System.out.println("--------欢迎来到学生管理系统--------");
System.out.println("1.添加学生");
System.out.println("2.删除学生");
System.out.println("3.修改学生");
System.out.println("4.查看所有学生");
System.out.println("5.退出");
System.out.println("请输入你的选择:");
//用Scanner实现键盘录入数据
Scanner sc=new Scanner(System.in);
String line=sc.nextLine();
//用switch语句完成操作的选择
switch(line) {
case "1":
System.out.println("--------添加学生--------");
addStudent(array);//添加学生
break;
case "2":
//System.out.println("删除学生");
deleteStudent(array);
break;
case "3":
//System.out.println("修改学生");
updateStudent(array);
break;
case "4":
//System.out.println("查看所有学生");
findAllStudent(array);
break;
case "5":
System.out.println("谢谢使用");
//break;
System.exit(0);//JVM退出
}
}
}
public static void addStudent(ArrayList<Student> array){
//键盘录入学生对象所需要的数据,显示提示信息,提示要输入何种信息
Scanner sc=new Scanner(System.in);
String sid;//为了让sid在while循环外面被访问到,我们就把他定义在了外面
while(true) {
System.out.println("请输入学生学号:");
sid = sc.nextLine();
boolean flag = isUsed(array, sid);
if (flag) {
System.out.println("该学号已被使用,请重新输入");
}else{
break;
}
}
System.out.println("请输入学生姓名:");
String name=sc.nextLine();
System.out.println("请输入学生年龄:");
String age=sc.nextLine();
System.out.println("请输入学生居住地:");
String address=sc.nextLine();
//创建学生对象,把键盘录入的信息赋值给学生对象的成员变量
Student s=new Student();
s.setSid(sid);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//将学生对象添加到集合中
array.add(s);
//给出添加成功的提示
System.out.println("添加学生成功");
}
public static void findAllStudent(ArrayList<Student> array){
if(array.size()==0){//判断集合中是否有数据,如果没有显示提示信息
System.out.println("无信息,请先添加信息再查询");
return;//为了让程序不再继续往下执行
}
//显示表头信息
System.out.println("学号\t姓名\t年龄\t 居住地\t");
//将集合中的数据取出按照对应的格式显示学生信息,年龄显示补充”岁“
for(int i=0;i<array.size();i++){
Student s=array.get(i);
System.out.println(s.getSid()+"\t"+s.getName()+"\t"+s.getAge()+"岁\t"+s.getAddress());
}
}
public static void deleteStudent(ArrayList<Student> array){
//键盘录入要删除学生的学号,显示提示信息
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要删除的学生的学号:");
String sid=sc.nextLine();
int index=-1;
for(int i=0;i<array.size();i++){
Student s=array.get(i);
if(s.getSid().equals(sid)){
index=i;
break;
}
}
if(index==-1){
System.out.println("该信息不存在,请重新输入");
}else{
array.remove(index);
//给出删除成功提示
System.out.println("删除学生成功");
}
}
public static void updateStudent(ArrayList<Student> array){
//键盘录入要修改的学生学号,显示提示信息
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要修改的学生学号");
String sid = sc.nextLine();
int index=-1;
for(int i=0;i<array.size();i++){
Student stu=array.get(i);
if(stu.getSid().equals(sid)){
index=i;
break;
}
}
if(index==-1){
System.out.println("该信息不存在,请重新输入");
}else{
//键盘录入要修改的学生信息
System.out.println("请输入学生新姓名:");
String name=sc.nextLine();
System.out.println("请输入学生新年龄:");
String age=sc.nextLine();
System.out.println("请输入学生新居住地:");
String address=sc.nextLine();
//创建学生对象
Student s=new Student();
s.setSid(sid);
s.setName(name);
s.setAge(age);
s.setAddress(address);
array.set(index,s);
System.out.println("修改学生成功");
}
}
//判断学号是否被使用
public static boolean isUsed(ArrayList<Student> array,String sid){
boolean flag=false;
for(int i=0;i<array.size();i++){
Student stu=array.get(i);
if(stu.getSid().equals(sid)) {
flag = true;
break;
}
}
return flag;
}
}
注意:
-
用s.getSid().equals(sid)来比较学生类里的sid与输入的sid是否想等。
-
System.exit(0);//JVM退出
-
写代码时要注意录入非法信息时给用户一定提示
-
sc.nextLine()与sc.nextInt()导致部分字符不接收直接跳过问题
nextInt()和nextLine()它们的运行机制:
- nextInt():接收一个整型数字,注意,它只接收数字;
- nextLine():接收一串字符串,包括空格、制表符、换行符。
这样一来原因就很明显了,当我们输入数字后,是不是按下了回车键,这个时候,nextInt()从缓冲区把我们输入的数字读走了,但留下了最后的换行符,等运行到nextLine()的时候,它开始读缓冲区里的内容,然而好巧不巧的是,刚好缓冲区里留有一个换行符,相当于还没给我们机会去输入东西,就按回车结束了。解决方案:
解决方案:
1.在输入字符串前先把缓冲区里的换行符读取掉,比如使用一次nextLine()
2.使用next()取代nextLine(),因为next()这个方法它从缓冲区读取的内容为:从第一个有效字符开始,到最后一个有效字符结束。