如何在存储TeamRecord对象的自定义链表中按队名字段搜索?
看起来你遇到的核心问题是类型不匹配——你的MyLinkedList<TeamRecord>的search方法原本设计用来接收和链表元素同类型的对象(也就是TeamRecord),但你传入的是String类型的球队名称,Java编译器当然会报错。而且teams是链表实例,不是单个TeamRecord对象,所以teams.getTeamName()这种调用本身就不成立。
接下来给你两种解决方案,其中第二种更通用,推荐使用:
方案一:重载search方法,专门针对球队名称搜索
这种方式适合你确定链表只会存储TeamRecord对象的场景,直接在MyLinkedList类里添加一个接收String的重载方法:
public boolean search(String teamName) { if (isEmpty()) return false; Node<E> temp = head; while (temp != null) { // 先判断元素类型,避免强转出错 if (temp.getElement() instanceof TeamRecord) { TeamRecord currentTeam = (TeamRecord) temp.getElement(); if (currentTeam.getTeamName().equals(teamName)) { return true; } } temp = temp.getNext(); } return false; }
然后你原来的调用代码就可以直接用了:
case 5: System.out.println("Enter team name to search: "); String input = console.next(); if(teams.search(input)) System.out.println(input + " is a team."); else System.out.println(input + " is not a team."); break;
方案二:使用Predicate实现通用搜索(推荐)
如果你希望你的MyLinkedList保持泛型的通用性(以后可以存储其他类型的对象),可以新增一个接收Predicate<E>的搜索方法,这样就能自定义匹配逻辑:
// 新增这个通用搜索方法 public boolean search(Predicate<E> matcher) { if (isEmpty()) return false; Node<E> temp = head; while (temp != null) { if (matcher.test(temp.getElement())) { return true; } temp = temp.getNext(); } return false; }
调用的时候用Lambda表达式指定匹配规则(这里就是匹配TeamRecord的teamName):
case 5: System.out.println("Enter team name to search: "); String input = console.next(); // 用Lambda定义匹配逻辑:检查当前球队的名称是否等于输入的字符串 boolean teamExists = teams.search(team -> team.getTeamName().equals(input)); if(teamExists) { System.out.println(input + " is a team."); } else { System.out.println(input + " is not a team."); } break;
这种方式的好处是,不管你的链表以后存什么对象(比如User、Product),都可以通过Lambda快速定义搜索规则,非常灵活。
小优化:清理原search方法的冗余代码
你的原search(E element)方法里有一行多余的代码:
Node<E> temp = new Node<E>(element, null);
这行代码新建了一个节点,但马上就把temp赋值为head,完全没用到这个新建的节点,直接删掉就好,优化后的原search方法:
public boolean search(E element) { if(isEmpty()) return false; Node<E> temp = head; // 直接指向头节点即可 while(temp != null) { if(temp.getElement().equals(element)) return true; temp = temp.getNext(); } return false; }
内容的提问来源于stack exchange,提问作者H0ltD33zNuttz
相关产品推荐
相关产品推荐

