项目背景:学生管理系统中,不管修改还是删除,都需要优先查找到某个学生,那么查找就是一个重复率很高的方法,可以重新做出来。
1.分析设计,根据重复调用查找的思路,返回下标,来锁定需要操作的元素,或者返回-1,来表示查无此人。
2.在该系统中,三个数组的长度应设定为全局变量,同时,设定一个L来控制数组中的有效元素,实现有效数据的更多操作。
1、添加"+"\n"+"2、显示"+"\n"+"3、删除"+"\n"+"4、查找"+"\n"+"5、修改"+"\n"+"6、排序"+"\n"+"7、退出"
- 主界面
package OO0906;
import javax.swing.JOptionPane;
public class studentsCRM {
public static String[] namearr = new String[20];
public static int[] idarr = new int[20];
public static int[] gradearr = new int[20];
public static int l = 0;
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, star("*") + "\n" + "\n"
+ "欢迎登陆学生管理系统" + "\n" + "\n" + star("*"));
String admin = "123";
int pwd = 123;
login(admin, pwd);//调用登陆方法
int choose = 0;
while (true) {
choose = Integer.parseInt(JOptionPane.showInputDialog(null, "1、添加"
+ "\n" + "2、显示" + "\n" + "3、删除" + "\n" + "4、查找" + "\n"
+ "5、修改" + "\n" + "6、成绩排序" + "\n" + "7、退出"));
switch (choose) {
case 1:
infAdd();
outinf();
break;
case 2:
outinf();
break;
case 3:
del();
break;
case 4:
find();
break;
case 5:
update();
break;
case 6:
rowarr();
outinf();
break;
case 7:
;
System.exit(0);
}
}
}
- 添加——每次添加,实际是一个数组元素来接收外部数据,所以,且,每次添加之后,该位置的元素就不能被下一个输入顶替,所以要实现同步的L++,并使用L作为数组的下标,来实现,数组元素的有序增加。
/** 信息的添加 */
public static void infAdd() {
idarr[l] = Integer.parseInt(JOptionPane.showInputDialog(null,
"请输入学生的学号"));
namearr[l] = JOptionPane.showInputDialog(null, "请输入学生的姓名");
gradearr[l] = Integer.parseInt(JOptionPane.showInputDialog(null,
"请输入学生的成绩"));
l++;
}
- 显示——显示做一个遍历就可以了,for循环里要写 i<L
/** 信息显示 */
public static void outinf() {
String s = "";
for (int i = 0; i < l; i++) {
s += namearr[i] + " " + idarr[i] + " " + gradearr[i] + "\n";
}
JOptionPane.showMessageDialog(null, s);
}
- 删除——将需要删除的数组元素L之后的所以元素向前赋值一位,就直接替换掉了L元素
/** 删除,查找,把下标之后的数组全部向前替换 */
public static void del() {
int index = find();
if (index != -1) {
for (int i = index; i < l; i++) {
namearr[i] = namearr[i + 1];
idarr[i] = idarr[i + 1];
gradearr[i] = gradearr[i + 1];
}
l--;
}
outinf();
}
- 查找——使用的最多的,返回i或者-1,返回-1的时候,可以加入,查无此人在方法里。
/** 查找方法,这是一个重复率很高的方法,精髓在于要反复调用是为了找到学生的位置,所以要返回下标,要用int返回 */
public static int find() {
String checkname = JOptionPane.showInputDialog(null, "请输入要查找的姓名");
for (int i = 0; i < l; i++) {
if (namearr[i].equals(checkname)) {
JOptionPane.showMessageDialog(null, namearr[i] + gradearr[i]
+ idarr[i]);
return i;
}
}
JOptionPane.showMessageDialog(null, "查无此人");
return -1;
}
- 修改——查找匹配i,然后直接接收就行了,注意类型转换;
/** 修改,先调用查找,然后根据下标修改数组,不需要返回 */
public static void update() {
int index = find();
if (index != -1) {
namearr[index] = JOptionPane.showInputDialog(null, "新的姓名");
idarr[index] = Integer.parseInt(JOptionPane.showInputDialog(null,
"新的学号"));
gradearr[index] = Integer.parseInt(JOptionPane.showInputDialog(
null, "新的成绩"));
}
outinf();// 修改完了,直接调用显示方法
- 排序——尽量精简,要多次使用
/** 根据成绩排序 */
public static void rowarr() {
for (int i = 0; i < l; i++) {
for (int j = i + 1; j < l; j++) {
if (gradearr[i] < gradearr[j]) {
int temp = gradearr[i];
gradearr[i] = gradearr[j];
gradearr[j] = temp;
int temp1 = idarr[i];
idarr[i] = idarr[j];
idarr[j] = temp1;
String temp2 = namearr[i];
namearr[i] = namearr[j];
namearr[j] = temp2;
}
}
}
}