前段时间写的教务管理系统后端用到了集合,只是当时并不是太懂集合的作用,只是根据一些资料来用
通过一个简单的本地教务管理系统重新来认识下集合到底是什么
为了方便,我就把所有的都写在一个类中,我们创建学生类就直接采用内部类的方式创建
1 //采用内部类的方式创建学生类 2 public static class Student { 3 //暂且创建三个属性,重点是为了理解List集合 4 public int id; 5 public String name; 6 public String pwd; 7 8 //创建一个构造函数 9 public Student(int id, String name, String pwd) { 10 this.id = id; 11 this.name = name; 12 this.pwd = pwd; 13 } 14 15 //重写toString方法 16 @Override 17 public String toString() { 18 return "Student{" + 19 "id=" + id + 20 ", name='" + name + '\'' + 21 ", pwd='" + pwd + '\'' + 22 '}'; 23 } 24 }
创建完内部类,我们开始创建List集合的全局变量,这里要说一下,导包绝对是util包,不是awt包,不然会出问题
//创建List集合的全局变量 static List<Student> list = new ArrayList<Student>();
尖括号中的Student表示的是泛型,这个不给也可以,不给的话默认都是Object类型,如果给了,就都是Student类型
ArrayList是线性存储,我们做教务管理系统用这个就足够了
因为List集合有完整的增删改的方法,所以我们可以把所有的操作都写在switch里面,当然,工作中是不允许这样做
添加和查询是最好做的,添加可以直接用add方法
//调用add方法添加数据 list.add(new Student(getInt("请输入学生ID:"),getString("请输入学生姓名:"),getString("请输入学生密码:")));
这样一行代码就可以解决了,接下来查询,使用foreach循环就行了
//使用foreach循环遍历集合 for(Student info:list){ pl(info.toString()); }
但是接下来,使用修改和删除的时候,这2个的方法是通过下标来工作的,所以在写这2个方法的时候,我们需要写一个获取下标的方法
1 //根据ID获取集合下标 2 public static int getIndexById(int id){ 3 //使用一个变量来存取下标 4 int index = 0; 5 //开始遍历 6 for(Student info:list) { 7 //判断是否找到,找到就返回 8 if(info.id==id) 9 return index; 10 //没有找到就自增,找下一个 11 index++; 12 } 13 //如果所有都没找到,就返回-1 14 return -1; 15 }
那么接下来,写删除和修改就不是什么难事了,调用方法就行,贴上所有代码
1 package org.lanqiao.jwglx; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Scanner; 6 7 public class demo { 8 9 //采用内部类的方式创建学生类 10 public static class Student { 11 //暂且创建三个属性,重点是为了理解List集合 12 public int id; 13 public String name; 14 public String pwd; 15 16 //创建一个构造函数 17 public Student(int id, String name, String pwd) { 18 this.id = id; 19 this.name = name; 20 this.pwd = pwd; 21 } 22 23 //重写toString方法 24 @Override 25 public String toString() { 26 return "Student{" + 27 "id=" + id + 28 ", name='" + name + '\'' + 29 ", pwd='" + pwd + '\'' + 30 '}'; 31 } 32 } 33 34 //创建List集合的全局变量 35 static List<Student> list = new ArrayList<Student>(); 36 //创建输入对象 37 static Scanner input = new Scanner(System.in); 38 39 public static void main(String[] args) { 40 //死循环让菜单一直输出 41 while(true) { 42 //打印菜单 43 pl("------------------------"); 44 pl("1、添加学生"); 45 pl("2、删除学生"); 46 pl("3、修改学生"); 47 pl("4、查询学生"); 48 pl("0、退出系统"); 49 pl("------------------------"); 50 51 //进行功能选择 52 switch(getInt("请输入功能编号<0-4>:")) { 53 case 1: 54 //调用add方法添加数据 55 list.add(new Student(getInt("请输入学生ID:"),getString("请输入学生姓名:"),getString("请输入学生密码:"))); 56 break; 57 case 2: 58 //调用remove方法删除指定对象 59 list.remove(getIndexById(getInt("请输入需要删除的学生ID:"))); 60 break; 61 case 3: 62 //调用set方法替换对象 63 list.set(getIndexById(getInt("请输入需要修改的学生ID:")),new Student(getInt("请输入修改后的学生ID:"),getString("请输入修改后的学生姓名:"),getString("请输入修改后的学生密码:"))); 64 break; 65 case 4: 66 //使用foreach循环遍历集合 67 for(Student info:list) { 68 pl(info.toString()); 69 } 70 break; 71 case 0: 72 System.exit(0); 73 default: 74 pl("编号输入有误!"); 75 } 76 } 77 } 78 79 //根据ID获取集合下标 80 public static int getIndexById(int id){ 81 //使用一个变量来存取下标 82 int index = 0; 83 //开始遍历 84 for(Student info:list) { 85 //判断是否找到,找到就返回 86 if(info.id==id) 87 return index; 88 //没有找到就自增,找下一个 89 index++; 90 } 91 //如果所有都没找到,就返回-1 92 return -1; 93 } 94 95 //以下都为工具方法,为了便捷而创建 96 public static void p(String msg) { 97 System.out.print(msg); 98 } 99 100 public static void pl(String msg) { 101 System.out.println(msg); 102 } 103 104 public static int getInt(String msg) { 105 p(msg); 106 return input.nextInt(); 107 } 108 109 public static String getString(String msg) { 110 p(msg); 111 return input.next(); 112 } 113 }