一、定义一个Solution类,用于创建对象
package com.javabase;
/*
Alt + Insert 可以选择构造生成构造方法和get set方法
ctrl alt v可以自动补齐返回值
*/
public class Solution{
private String sid;
private String name;
private String age;
private String add;
public Solution() {}
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 getAdd() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
}
二、创建增删改查
package com.javabase;
import java.util.ArrayList;
import java.util.Scanner;
/*
ArrayList常用方法:add(element), remove(element), remove(index), set(index, element), get(index), size()
不支持链式add,java: 无法取消引用boolean。因为add实际上会隐式返回是否添加成功的boolean。index越界会报异常。
*/
public class Test{
public static void main(String[] args) {
ArrayList<Solution> array = new ArrayList<>();
while (true) {
System.out.println("---欢迎来到召唤师峡谷---");
System.out.println("1 Add");
System.out.println("2 Remove");
System.out.println("3 Merge");
System.out.println("4 Show");
System.out.println("5 Exit");
System.out.println("请输入:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
switch (num) {
case 1: {
add(array);
break;
} case 2 : {
remove(array);
break;
} case 3 : {
merge(array);
break;
} case 4 : {
show(array);
break;
} case 5 : {
System.exit(-1);
} default:{
System.out.println("您的输入有误,请重新输入");
}
}
}
}
public static void add(ArrayList<Solution> array) {
System.out.println("请输入要添加的学生工号sid");
Scanner sc = new Scanner(System.in);
String sid = sc.nextLine();
System.out.println("请输入要添加的学生姓名name");
String name = sc.nextLine();
System.out.println("请输入要添加的学生年龄age");
String age = sc.nextLine();
System.out.println("请输入要添加的学生地址add");
String add = sc.nextLine();
Solution student = new Solution();
student.setSid(sid);
student.setName(name);
student.setAge(age);
student.setAdd(add);
if(array.size() == 0) {
array.add(student);
System.out.println("添加成功");
}else {
for(int i = 0; i < array.size(); i++){
Solution solution = array.get(i);
if(solution.getSid().equals(sid)){
System.out.println("您尝试新增的学号sid已存在,新输入其他学号sid,或" +
"使用Merge修改已有学号sid相关信息");
}else{
array.add(student);
System.out.println("添加成功");
}
}
}
}
public static void remove(ArrayList<Solution> array){
System.out.println("请输入您要删除学生的学号sid:");
Scanner sc = new Scanner(System.in);
String sid = sc.nextLine();
int index = -1;
for(int i = 0; i < array.size(); i++) {
Solution solution = array.get(i);
if(solution.getSid().equals(sid)){
index = i;
break;
}
}
if(-1 == index) {
System.out.println("您输入的学号sid不存在,已退回主菜单,请重新操作");
}else {
array.remove(index);
System.out.println("删除成功");
}
}
public static void merge(ArrayList<Solution> array){
System.out.println("请输入您要修改的学生学号sid:");
Scanner sc = new Scanner(System.in);
String sid = sc.nextLine();
int index = -1;
for(int i = 0; i < array.size(); i++) {
Solution solution = array.get(i);
if(solution.getSid().equals(sid)) {
index = i;
break;
}
}
if(-1 == index) {
System.out.println("您输入的学号sid不存在,已退回主菜单,请重新操作");
}else{
System.out.println("请输入您要修改该学生的姓名name为:");
String name = sc.nextLine();
System.out.println("请输入您要修改该学生的年龄age为:");
String age = sc.nextLine();
System.out.println("请输入您要修改该学生的地址add为:");
String add = sc.nextLine();
Solution newSolution = new Solution();
newSolution.setSid(sid);
newSolution.setName(name);
newSolution.setAge(age);
newSolution.setAdd(add);
array.set(index, newSolution);
System.out.println("修改成功");
}
}
public static void show(ArrayList<Solution> array){
if(array.size() == 0) {
return;
}else{
System.out.println("Sid\t\tName\tAge\t\tAdd");
for(int i = 0; i < array.size(); i++) {
Solution solution = array.get(i);
System.out.println(solution.getSid() + "\t\t" + solution.getName() +
"\t\t" + solution.getAge() + "\t\t" + solution.getAdd());
}
}
}
}
三、其中add中学号sid实际上类似于索引列。
如果存在多条学号相同的信息,1、不符合常理;2、merge和delete操作只会删除最靠前的学号sid对象就break了。之后的无法删除。break的作用也是为了提高效率,既然找到要删除的sid,直接删除array内的对象就行了。
为了解决这个问题,在add中直接判重即可,sid重复的话加不进来。
但是在判重的时候需要遍历array中是否已存在现在正在输入的sid,要分情况,如下:
array空? DO:( sid已存在?报Err :DO)
或者等价于:array非空?(sid已存在?报Err:DO):DO。能想到只需判断if(array.size() != 0 && sid已存在){Err} else {DO}
但是sid是否已经存在,是for循环。array是否非空通过array.size()==0的if判断进行,这两部分无法取&&
这个问题暂时没解决,所以只能用if(for(if))else这种低效且代码冗余的方法。
后续有大佬看到 有更好的解法欢迎留言。