思路分析
- 我们需要自己定义联系人的类即联系人的数据类型
- 创建联系人类的实例,并通过方法(public)返回以供主函数调用
- 将实例化联系人对象作为参数传递给增删改查保存类的相应方法
- 在增删改查保存类中对实例进行操作
- 尽量满足Java的设计原则
定义联系人类
创建类,定义联系人所拥有的属性,如名字,年龄,联系电话,住址等.
重写构造器,将定义联系人属性全部作为参数传递给构造器
重写toString()方法以完成对电话簿的查询功能
若使用数组,则需要定义有效长度
小白必读
我们定义的数组是联系人类的数组,每new一个联系人类的实例,都将通过下标赋值给数组的空储存地址,但由于每创建一个联系人都有各自的属性,Java没有可以直接获得数组有效长度的方法,因此我们需要一个变量来记录数组的有效长度,而这个变量对于数组中每一个元素必须保持一致,因此需要用static变量来修饰.
这里将有效长度定义为-1,因为数组的下标从0开始,每增加一个元素就将有效长度加一,方便我们通过有效长度直接遍历数组(真实的有效长度应该说我们定义的有效长度加一).
public class People_Phone {
//定义自己的数据类型People_Phone
private String name;//名字
private int phoneNum;//电话
private int qq;//QQ
public static int EffectiveLength = -1;//有效长度
//重写构造器
public People_Phone(String name,int phoneNum,int qq){
this.name=name;
this.phoneNum=phoneNum;
this.qq=qq;
}
public String getName(){
return name;
}
@Override
//重写toString方法
public String toString() {
return "People_Phone{" +
"name='" + name + '\'' +
", phoneNum=" + phoneNum +
", qq=" + qq +
'}';
}
}
创建联系人数组
创建联系人数组并使用private来修饰数组,避免直接调用数组,使用get方法将外界传递数组
public class New_People_Phone {
private People_Phone[] phone_list = new People_Phone[100];
//创建数组
public People_Phone[] getList(){
return phone_list;
}
//get方法
}
对联系人数组的操作
增加联系人
我将增加联系人分为了两个类
- 第一个类为了获得联系人的属性,并创建一个联系人的实例
import java.util.Scanner;
public class New_People {
public static People_Phone newPeople() {
String name;
int phoneNum;
int qq;
Scanner scan = new Scanner(System.in);
System.out.println("输入联系人姓名");
name = scan.next();
System.out.println("输入联系人电话");
phoneNum = scan.nextInt();
System.out.println("输入联系人QQ");
qq = scan.nextInt();
People_Phone newPeople = new People_Phone(name, phoneNum, qq);
//创建联系人实例
return newPeople;
}
}
- 第二个类将获得的联系人实例赋值给联系人数组,并判断联系人数组是否已满,给出提示信息
public class Add_People {
public static void add(People_Phone[] list, People_Phone newPeople){
if(People_Phone.EffectiveLength == list.length){
System.out.println("电话薄已满,无法添加");
return;
}
list[++People_Phone.EffectiveLength] = newPeople;
System.out.println("添加成功");
}
}
删除联系人
删除联系人分为三个小部分
- 根据所给的删除信息遍历数组,查早相应的元素,并记录元素所在位置
- 判断删除的元素是否为数组有效长度的最后一位,若是则有效长度减一退出方法
- 若不是则需要将数组删除的元素后面的元素全部前移一位,并将有效长度最后一位删除(也可以不删除,增加元素时会直接覆盖原数据,遍历数组时使用有效长度遍历,因此原数据不会对我们造成任何影响)
public class Del_People {
public static void del(People_Phone[] list,String a){
int i ;
for ( i = 0; i < People_Phone.EffectiveLength; i++) {
//查询所删除的联系人在数组的位置
if(list[i].getName().equals(a)){
list[i] = null;
break;
}
}
if(i == People_Phone.EffectiveLength){
//判断删除的联系人是否为数组有效长度的最后
People_Phone.EffectiveLength--;
return;
}
for (int j = i; j <= People_Phone.EffectiveLength; j++) {
list[i] = list[i+1];
//将数组元素前移
}
list[People_Phone.EffectiveLength] = null;
//将数组有效长度的最后一位删除
People_Phone.EffectiveLength--;
System.out.println("删除成功");
}
}
修改联系人
思路非常简单,我们只需要找到对应的联系人后删除(也可以不用删除,直接赋新值,不需要担心储存问题,Java会自动帮我们删除没有指向的数据),然后新建一个联系人并赋值给所删除的联系人
public class Updata_People {
public static void updata(People_Phone[] list,String a){
int i ;
for ( i = 0; i <= People_Phone.EffectiveLength; i++) {
if(list[i].getName().equals(a)){
list[i] = null;
break;
}
}
list[i] = New_People.newPeople();
System.out.println("更新成功");
}
}
查询联系人
遍历数组,找到符合查询的联系人,调用toString()方法
public class Find_People {
public static void find(People_Phone[] list,String a) {
for (int i = 0; i <=People_Phone.EffectiveLength; i++) {
if (list[i].getName().equals(a)) {
System.out.println(list[i].toString());
break;
}
}
}
}
保存联系人
遍历数组并调用toString()方法将返回值输入到文件中
public class Preservation_People1 {
public static void preservation(People_Phone[] list) throws IOException {
FileWriter writer = new FileWriter(new File("D:\\untitled\\javaHomework\\src\\People_Phone", "电话簿"));
//小白必读 这里的路径是作者电脑的路径,兄弟们需要自己改一下
for (int i = 0; i <=People_Phone.EffectiveLength; i++) {
writer.write(list[i].toString()+"\r\n");
}
writer.close();
System.out.println("保存成功");
}
}
打印联系人
遍历数组,并调用toString()方法,将返回值输出
public class Print_People {
public static void print(People_Phone[] list) {
for (int i = 0; i <= People_Phone.EffectiveLength; i++) {
System.out.println(list[i].toString());
}
}
}
测试类(主函数)
用输出模拟窗口就不说了
我们用循环将窗口一直保持开启,不断的让用户输入来对联系人数组进行操作
小白必读
== 由于我们在写保存联系人类时将异常向上抛出,所以测试类调用了保存联系人类就需要对该异常进行操作(向上抛出或者try…catch…),这里我选择向上抛出,因此导入了io异常包==
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
New_People_Phone newPeoplePhone = new New_People_Phone();
People_Phone[] list = newPeoplePhone.getList();
System.out.println("***********欢迎来到电话簿管理系统************");
int i = -1;
String name;
while (i != 7) {
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.打印电话簿");
System.out.println(" 7.退出电话簿");
System.out.println("_______________________________________");
i = scanner.nextInt();
String s1;
switch (i) {
case 1:
Add_People.add(list, New_People.newPeople());
break;
case 2:
System.out.println("请输入你要删除的姓名");
s1 = scanner.next();
Del_People.del(list, s1);
break;
case 3:
System.out.println("请输入你要修改联系人的姓名");
s1 = scanner.next();
Updata_People.updata(list, s1);
break;
case 4:
System.out.println("请输入你要你查询联系人的姓名");
s1 = scanner.next();
Find_People.find(list, s1);
break;
case 5:
System.out.println("保存文件");
Preservation_People1.preservation(list);
break;
case 6:
Print_People.print(list);
break;
case 7:
i = 7;
System.out.println("退出成功");
break;
}
}
}
}