Java 模拟电话簿(用数组暂存数据),并最终生成文件保存

思路分析

  • 我们需要自己定义联系人的类即联系人的数据类型
  • 创建联系人类的实例,并通过方法(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;
            }
        }
    }
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值