jmu-Java-PTA题解 (exam02-通讯录生成) 网安2312陈卓

问题要求

创建一个Person类来存放联系人信息,其中包含以下属性

String name

int age

String phoneNumber

String address

要求编写getter/setter()方法,toString()方法

Main函数中:

输入整数n

然后输入n个name,age,phoneNumber,address,生成相应的person对象。

最后要求按姓名升序进行通讯录信息的输出。

输入格式:

输入整数n

输入n行的name,age,phoneNumber,address

输出格式:

按照姓名升序进行输出

输入样例:

5
Tina 18 123456 jmu
Alias 20 234567 smu
Mike 19 345678 CN
Bob 33 456789 USA
Blobg 21 567890 India

输出样例:

Person [name=Alias, age=20, phoneNumber=234567, address=smu]
Person [name=Blobg, age=21, phoneNumber=567890, address=India]
Person [name=Bob, age=33, phoneNumber=456789, address=USA]
Person [name=Mike, age=19, phoneNumber=345678, address=CN]
Person [name=Tina, age=18, phoneNumber=123456, address=jmu]

关键点

  • Comparable接口的运用:Person类实现了Comparable接口,并重写了compareTo方法,按照姓名进行比较。这样就能使用Collections.sort方法对Person对象列表按姓名升序排序。
  • 数据输入与对象创建:借助Scanner类从控制台读取输入,每读取一行数据就创建一个Person对象,并将其添加到ArrayList中。
  • 对象信息输出:重写toString方法,按指定格式输出Person对象的信息。

解题步骤

第一步:编写Person类

定义Person类,包含私有属性name、age、phoneNumber和address。提供构造函数用于初始化属性,同时实现各个属性的getter方法和toString方法。让Person类实现Comparable接口,并重写compareTo方法,按姓名进行比较。

class Person implements Comparable<Person>{
    String name;
    int age;
    String phoneNumber;
    String address;

    public Person(String name, int age, String phoneNumber, String address){
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
        this.address = address;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }

    public String getPhoneNumber(){
        return phoneNumber;
    }

    public String getAddress(){
        return address;
    }

    public String toString(){
        return "Person [name="+name+", age="+age+", phoneNumber="+phoneNumber+", address="+address+"]";
    }

    public int compareTo(Person other){
        int namecompareTo = this.name.compareTo(other.name);
        return namecompareTo;
    }
}

第二步:编写main方法

在main方法中,通过Scanner读取输入的联系人数量n,再循环读取n行联系人信息数据,每行数据创建一个Person对象并添加到ArrayList中。最后使用Collections.sort方法对列表进行排序,遍历列表并输出每个Person对象的信息。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        ArrayList<Person> arr = new ArrayList<Person>();
        int n = in.nextInt();
        for(int i=0; i<n; i++){
            Person e = new Person(in.next(), in.nextInt(), in.next(), in.next());
            arr.add(e);
        }
        Collections.sort(arr);
        for(Person i:arr){
            System.out.println(i.toString());
        }
    }
}

整体流程图:

整体代码:

import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;

class Person implements Comparable<Person>{
    String name;
    int age;
    String phoneNumber;
    String address;

    public Person(String name, int age, String phoneNumber, String address){
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
        this.address = address;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }

    public String getPhoneNumber(){
        return phoneNumber;
    }

    public String getAddress(){
        return address;
    }

    public String toString(){
        return "Person [name="+name+", age="+age+", phoneNumber="+phoneNumber+", address="+address+"]";
    }

    public int compareTo(Person other){
        int namecompareTo = this.name.compareTo(other.name);
        return namecompareTo;
    }
}
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        ArrayList<Person> arr = new ArrayList<Person>();
        int n = in.nextInt();
        for(int i=0; i<n; i++){
            Person e = new Person(in.next(), in.nextInt(), in.next(), in.next());
            arr.add(e);
        }
        Collections.sort(arr);
        for(Person i:arr){
            System.out.println(i.toString());
        }
    }
}

思考:从接口实现的角度来看,Person类实现Comparable接口是整个排序功能的核心。Comparable接口定义了对象之间自然排序的规则,通过重写compareTo方法,我们明确了以姓名作为比较依据来进行升序排列。这种设计使得Person对象具备了 “可比较” 的特性,从而能够直接利用Collections.sort方法进行高效排序。这一机制不仅简化了排序逻辑的实现,还增强了代码的规范性和一致性。在实际项目中,对于具有排序需求的对象类,实现Comparable接口是一种非常常见且有效的做法,例如在电商系统中对商品按照名称、价格等属性进行排序,或是在图书馆管理系统中对书籍按书名、作者进行排序等场景都能应用。在数据处理方面,使用ArrayList作为数据容器,利用其动态扩容的特性,能够灵活应对不同数量的联系人信息存储需求。在实际应用中,如日志记录系统、用户注册信息收集系统等,都需要类似的方式来处理和存储动态输入的数据。重写toString方法看似简单,实则意义重大。它将Person对象的各个属性以一种清晰、易读的格式进行输出,极大地提高了代码的可读性和可调试性。当程序在运行过程中需要查看对象的具体信息时,直接调用toString方法即可获取格式化后的内容,而无需手动拼接各个属性。这在大型项目中,尤其是涉及到复杂对象信息展示的模块,如用户个人信息页面展示、系统日志记录对象信息等场景,能够有效减少代码的冗余和出错概率。此外,将联系人信息封装在Person类中,通过类的属性和方法来管理数据,使得代码的逻辑更加清晰,也方便后续对联系人信息管理功能进行扩展和维护。例如,后续若需要添加联系人的邮箱、性别等新属性,只需在Person类中进行相应的修改,并适当调整compareTo和toString方法,而无需对整个程序结构进行大规模改动。这种可扩展性和可维护性是衡量一个优秀程序设计的重要标准,在软件开发的全生命周期中都发挥着关键作用。

posted @ 2025-04-30 10:21  取名字比写博客还难  阅读(19)  评论(0)    收藏  举报