提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、集合类概述
- 二、数组列表
- 1.优势
- 2.相关操作
- 3.项目实战——学生信息管理系统
前言
前面写了Java数组的相关内容,这里将学习集合类之一数组列表ArrayList,那么什么是集合类?数组列表是什么?与前面所学的数组有什么区别呢?相关操作又有哪些呢?
一、集合类概述
集合类位于java.util包下,它提供的的是一种存储空间可变的数据模型,存储的是对象而非基本数据类型,主要分为 list、Queue、Set、Map四大类。
二、数组列表
1.优势
数组列表作为集合类的子集同样具有与其相同的特性,相较于数组的存储空间是固定的,弹性的存储空间可以避免长度过长而造成的空间浪费以及过短而引起的数据溢出问题。同时,数组只能存放类型相同的元素,而数组列表可以存储不同类型的对象。因此,相比于数组,数组列表的使用更为灵活、宽泛、方便。还需要注意的一点是由于数组列表中存储的是对象,所以对于基本数据类型的使用,必须指定相应的有效包装类,即 int 型使用 Integer,其他基本数据类型对应使用 Character,Boolean,Double,Float,Short,Long.而String 型为引用类型,本身存放的就是对象,直接使用即可。
注:因为ArrayList 是util包下的,所以使用时需要导包
2.相关操作
(1)创建一个空表格
ArryList <泛型> 数组列表名=new ArrayList<>( );
这里的泛型可以是基本数据类型的有效包装类,也可以是自定义的类。
(2)添加方法:
<1>add(E e):将指定对象追加在数组列表末尾
<2>add(int index,E e):在数组列表的指定位置添加对象
注:添加元素时不能隔空添加,否则系统将报错——IndexOutOfBoundsException(索引越界)
(3)删除方法:
<1>remove(Object):删除数组列表中第一个与指定对象相同的对象,返回值为布尔型
<2>remove(int index):删除指定索引处的对象,返回值为被删除的对象
(4)修改方法:
set(int index,E element):修改指定索引处的对象,返回值为被修改对象
(5)集合中对象个数:数组中用的是length(),而数组列表用的是 size()
(6)获取某个对象:get(int index)
(7)indexOf(Object):返回指定对象所出现的索引值,若该对象不存在则返回 -1
lastIndexOf(Object):返回指定对象最后一次出现的索引值,若该对象不存在则返回 -1
(8)equals(Object):将指定对象与此列表进行比较判断二者是否相等,返回值为布尔型
(9)sort( ):排序
注:若使用 sort( ) 方法进行排序,需导Collections 类,即 import java.util.Collections
举例:
package 数组列表;
import java.util.ArrayList;
import java.util.Collections;
public class ArrayListTest{
public static void main(String[] args){
ArrayList<Integer> arr=new ArrayList<>();
for(int i=0;i<5;i++){
arr.add(i);
}
System.out.println(arr); //输出:[0, 1, 2, 3, 4]
arr.add(0,3);
System.out.println(arr); //[3, 0, 1, 2, 3, 4]
/*
对于存储整型对象的数组列表,若要删除指定对象,
需手动添加Object,否则系统将默认删除的是指定索引处的元素
*/
System.out.println(arr.remove((Object)1)); //true:[3, 0, 2, 3, 4]
System.out.println(arr.remove(2)); // 2:[3, 0, 3, 4]
System.out.println(arr.set(3,5)); //4:[3, 0, 3, 5]
System.out.println(arr.get(1)); //0
System.out.println(arr.size()); //获得数组列表长度:4
//遍历数组列表:跟数组一样采用for循环,但数组列表索引处对象的获取需使用get()方法
for(int j=0;j<arr.size();j++){
System.out.print(arr.get(j)+" ");
} //3 0 3 5
System.out.println("\n"+arr.indexOf(3)); //0:指定元素首次出现处的索引值
System.out.println(arr.lastIndexOf(3)); //2:指定元素最后出现处的索引值
System.out.println(arr.indexOf(2)); // -1:指定元素不存在
System.out.println(arr.equals(2)); //false
Collections.sort(arr);
System.out.println(arr); //[0, 3, 3, 5]
}
}
3.项目实战——学生信息管理系统
随着科技发展,计算机的使用不再止步于处理基本数据类型的相关操作,而是进一步去解决些非数值的相关问题,如信息系统,自动化,模式识别等,这里将处理简单的学生信息管理系统问题。
讲到学生信息管理,我们需要知道学生信息管理一般包含哪些属性?学号,姓名,年龄,家庭住址四方面。其次管理系统,肯定不是单个人的信息,所以需要使用到上面的数组列表。而且,信息的使用一般包括添加,删除,修改,查看等,因此,我们最后需要通过一系列方法完成这几项操作。
首先,创建学生管理系统主界面,包括添加,删除,修改,查看以及结束相关操作。
import java.util.ArrayList;
public class StudentInfor {
public static void main(String[] args){
//因为后期操作的具体实现都需要用到Student类的数组列表,为了方便,可将其创建在开头
ArrayList<Student> arr=new ArrayList<>();
System.out.println("*****************************");
System.out.println("*****************************");
System.out.println("*****欢迎来到学生信息管理系统*****");
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("6 结束");
}
}
其次,通过键盘输入选择具体的操作,需要使用switch()方法,还有一点就是,如果我完成了一个操作,想要重新回到学生信息管理系统继续进行其他操作的话,就需要使用条件循环语句
int a=0;
while(a!=6){
System.out.println("*****************************");
System.out.println("*****************************");
System.out.println("*****欢迎来到学生信息管理系统*****");
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("6 结束");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的选择:");
a = sc.nextInt();
switch (a) {
case 1:
System.out.println("添加学生信息");
break;
case 2:
System.out.println("修改学生信息");
break;
case 3:
System.out.println("删除学生信息");
break;
case 4:
System.out.println("查看指定学生信息");
break;
case 5:
System.out.println("查看所有学生信息");
break;
case 6:
System.out.println("结束");
break;
}
}
然后,我们需要创建Student类,并定义其相关属性和调用方法
public class Student {
private String num;
private String name;
private int age;
private String address;
//无参构造方法
public Student(){
}
public String getNum(){
return num;
}
public void setNum(String num){
this.num=num;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
然后,我们需要完成相应的具体操作。由于执行入口是静态的,所以这里我用的是static(静态)方法,调用的时候直接通过调用方法名即可。
(1)添加学生信息方法
因为学号一般都是唯一的,所以这里我们需要考虑到学号重复问题,如果添加的学号已经存在,系统将提醒:该学号已存在,请重新输入。
public static void addStudent(ArrayList<Student> arr) {
Student s=new Student();
Scanner sc = new Scanner(System.in);
String num;
/*
这里采用循环方式,如果学号重复,系统将提示:该学号已存在,请重新输入,
之后将回到while()语句继续执行;
如果学号不重复,将结束循环,执行下面的添加语句
*/
while (true) {
System.out.println("请输入需要添加的学生学号:");
num = sc.nextLine();
boolean flag = false;
for (int i = 0; i < arr.size(); i++) {
Student st = arr.get(i);
if (st.getNum() == num) {
flag = true;
}
}
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();
s.setNum(num);
s.setName(name);
s.setAge(age);
s.setAddress(address);
arr.add(s);
System.out.println("添加成功");
}
(2)修改学生信息方法
我采用的是通过学号查找,在对其信息进行修改
public static void setStudent(ArrayList<Student> arr){
Student s=new Student();
Scanner sc=new Scanner(System.in);
System.out.println("请输入需要修改信息的学生学号:");
String num=sc.nextLine();
//判断输入的学号是否存在
int index=-1;
for(int i=0;i<arr.size();i++){
Student ss=arr.get(i);
if(ss.getNum().equals(num)){
index=i;
}
}
if(index==-1){
System.out.println("该学号不存在,请重新输入");
}else{
System.out.println("请输入学生新学号:");
String num1 = sc.nextLine();
System.out.println("请输入学生新姓名:");
String name = sc.nextLine();
System.out.println("请输入学生新年龄:");
String age = sc.nextLine();
System.out.println("请输入学生新地址:");
String address = sc.nextLine();
s.setNum(num1);
s.setName(name);
s.setAge(age);
s.setAddress(address);
//将修改后的学生信息存储到数组列表arr中
for(int i=0;i< arr.size();i++){
Student st=arr.get(i);
if(st.getNum().equals(num)){
arr.set(i,s);
}
}
System.out.println("信息修改成功");
}
}
(3)删除指定学生信息方法
public static void deleteStudent(ArrayList<Student> arr){
System.out.println("需要删除的学生学号:");
Scanner sc=new Scanner(System.in);
String num=sc.nextLine();
int index=-1;
for(int i=0;i<arr.size();i++){
Student s=arr.get(i);
if(s.getNum().equals(num)){
index=i;
}
}
if(index==-1){
System.out.println("该学号不存在,请重新输入");
}else{
arr.remove(index);
System.out.println("删除信息成功");
}
}
(4)查看指定学生信息
public static void checkOneStudent(ArrayList<Student> arr) {
Scanner sc = new Scanner(System.in);
//判断数组列表中是否有信息
if (arr.isEmpty()) {
System.out.println("无信息,请先添加信息再查询");
} else {
System.out.println("请输入需要查看的学生的学号:");
String num = sc.nextLine();
for (int i = 0; i < arr.size(); i++) {
Student s = arr.get(i);
//判断输入信息是否正确
if (s.getNum().equals(num)) {
System.out.println("学号\t\t姓名\t\t年龄\t\t居住地");
System.out.println(s.getNum() + "\t\t" + s.getName() + " \t" +
s.getAge() + "岁\t" + s.getAddress());
} else {
System.out.println("输入信息有误,请重新输入");
}
}
}
}
(5)查看所有学生信息
public static void checkStudent(ArrayList<Student> arr){
//判断数组列表中是否有信息
if (arr.isEmpty()) {
System.out.println("无信息,请先添加信息再查询");
} else {
System.out.println("学号\t\t姓名\t\t年龄\t\t地址");
for(int i=0;i<arr.size();i++){
Student s=arr.get(i);
System.out.println(s.getNum()+"\t\t"+s.getName()+" \t"
+s.getAge()+"岁\t"+s.getAddress());
}
}
}
最后,在前面的switch() 语句里的输出操作下通过调用方法名调用对应的操作方法再编译执行就可以了。
提示:这里对文章进行总结:
上面的学生信息管理系统的实现我也只是完成了大致,像查询信息时我是通过学号查找的,但我们也可以根据姓名来查询;添加时考虑到学号重复问题,但如果学号、年龄等的输入格式出现错误呢等问题,大家可以根据现有的进一步去实现。而且我觉得这与数据结构中的线性表的使用也有些类似,如Student类就相当于名为Student的结构体;当我们创建Student类的对象s去接收数组列表中的内容时,s就相当于结点等。所以我认为这对于线性表的使用也有一定帮助。以上均属个人观点,初次学习,还请各位指教,谢谢。