You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java电话本开发中search方法跨类型姓名匹配实现问题

实现方案

你不需要直接比较String类型和Contact类型,Contact类已经提供了getName()方法获取实例内部存储的姓名字符串,遍历联系人数组时,逐个取出每个联系人对象的姓名属性,和入参做同类型字符串比对即可。

search方法补全代码

按照代码注释里提示的大小写不敏感匹配要求,补全后的逻辑如下:

public Contact search(String name) {
    String target = name.toLowerCase();
    for (int i = 0; i < capacity; i++) {
        Contact cur = contact[i];
        // 跳过数组空位,避免空指针
        if (cur == null) continue;
        if (cur.getName().toLowerCase().equals(target)) {
            return cur;
        }
    }
    return null;
}

逻辑说明

  • 遍历数组时拿到的每个contact[i]都是Contact类的实例,调用实例的getName()方法就能拿到它存的姓名,这时候就是两个String类型的值做比较,不存在类型不匹配的问题
  • 对入参和存储的姓名都调用toLowerCase()转成小写后再比较,实现不区分大小写的匹配,符合题目提示的要求
  • 加了空值判断,避免遍历到数组里还没存联系人的空位时抛出空指针异常

其他待补全方法参考

后续写update、delete方法时可以复用这套姓名匹配逻辑,参考实现如下:

update方法

public boolean update(Contact oldContact, Contact updatedContact) {
    boolean found = false;
    String targetName = oldContact.getName();
    for (int i = 0; i < capacity; i++) {
        if (contact[i] != null && contact[i].getName().equals(targetName)) {
            contact[i] = updatedContact;
            found = true;
            // 如果要求匹配所有同名联系人可以删掉break
            break;
        }
    }
    return found;
}

delete方法

public boolean delete(Contact target) {
    String targetName = target.getName();
    for (int i = 0; i < capacity; i++) {
        if (contact[i] != null && contact[i].getName().equals(targetName)) {
            contact[i] = null;
            // 如果要求删除后元素连续排列,可以在这里加逻辑把后面的元素往前移位
            return true;
        }
    }
    return false;
}

顺手提几个你现有代码里的明显问题,避免后续调试踩坑:

  • 构造方法里capacity++修改的是传入的局部参数,没有赋值给类的成员变量this.capacity,会导致成员变量capacity始终为初始值0
  • add方法添加联系人后没有给capacity做自增,会导致新联系人一直覆盖数组下标为0的位置
  • getContacts方法里返回的this.contacts不存在,你定义的联系人数组名是单数contact,这里会直接编译报错

内容的提问来源于stack exchange,提问作者Dexter1403

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:51:59