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始终为初始值0add方法添加联系人后没有给capacity做自增,会导致新联系人一直覆盖数组下标为0的位置getContacts方法里返回的this.contacts不存在,你定义的联系人数组名是单数contact,这里会直接编译报错
内容的提问来源于stack exchange,提问作者Dexter1403
相关产品推荐
相关产品推荐

