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

基于学生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:33:17