基于学生ID查找选民账户:双向链表搜索方法调用异常问题
问题:通过学生ID搜索选民详情失败的原因及解决方法
问题场景
需要实现仅通过学生ID(StudID)从双向链表中搜索对应选民的全部账户详情,但调用链表的search方法后无法得到预期结果。
提供的搜索方法代码
public T search(T data) { Node currentNode = getNode(data); if (currentNode != null) { return currentNode.data; } else { return null; } } private Node getNode(T data) { Node currentNode = this.firstNode; while (currentNode != null) { if (currentNode.data.equals(data)) { return currentNode; } currentNode = currentNode.next; } return currentNode; }
驱动程序代码
List<Voter> voterList = new DoublyLinkedList<>(); //Username, password, StudID voterList.add(new Voter("Alice", "password1", "001")); voterList.add(new Voter("Bob", "password2", "002")); voterList.add(new Voter("Charlie", "password3", "003")); String valueSearch = "003"; System.out.println(voterList.search(new Voter("", "", valueSearch)));
失败原因
核心问题是Voter类未重写equals()方法:
- 链表的
getNode方法中使用currentNode.data.equals(data)比较两个Voter对象,默认调用的是Object类的equals()方法,该方法只比较对象的内存地址,不会对比学生ID字段。 - 你创建的
new Voter("", "", valueSearch)是一个全新的对象,和链表中已存在的Voter对象内存地址完全不同,所以equals()会返回false,导致无法匹配到目标选民。
解决方法
1. 重写Voter类的equals()方法
让equals()方法基于学生ID进行比较,同时按照Java规范,建议一起重写hashCode()方法:
import java.util.Objects; public class Voter { private String username; private String password; private String studID; // 构造方法、getter/setter方法请自行补充 @Override public boolean equals(Object o) { // 先判断是否是同一个对象 if (this == o) return true; // 判断是否为空或类型不匹配 if (o == null || getClass() != o.getClass()) return false; // 强制转换为Voter类型 Voter voter = (Voter) o; // 仅比较studID字段是否相等 return Objects.equals(studID, voter.studID); } @Override public int hashCode() { // 基于studID生成哈希值 return Objects.hash(studID); } }
2. (可选)重写toString()方法
如果希望System.out.println能直接输出选民的全部详情,需要重写Voter的toString()方法:
@Override public String toString() { return "Voter{" + "用户名='" + username + '\'' + ", 密码='" + password + '\'' + ", 学生ID='" + studID + '\'' + '}'; }
3. 重新调用search方法
完成上述修改后,运行驱动代码就能正确匹配到学生ID为003的选民,并输出其全部账户详情。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

