【问题标题】:Java - returning largest String in a linkedlistJava - 返回链表中的最大字符串
【发布时间】:2013-03-03 22:03:11
【问题描述】:

编辑:我更新了帖子以回答您的一些问题。这是一个编程作业。我的解决方案不起作用: 要回答这个线程上的 cmets,它应该按字母顺序找到最大的字符串。例如,“Tom”比“Andy”大。

编写一个递归方法来查找单链表中的最大值。从类 LinkedList 继承并添加递归方法。您将需要使用迭代器来访问链表的每个节点。您可能需要添加一个辅助方法来启动递归。使用驱动程序类填充您的链接列表并证明您的方法有效。向驱动程序类添加额外的测试。 提供的驱动程序类中最大的是 Tom。

提供的驱动类:

public class MyLinkedListDriver {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyLinkedList myLinkedList = new MyLinkedList();
    myLinkedList.add("Sarah");
    myLinkedList.add("Barbara");
    myLinkedList.add("Tom");
    myLinkedList.add("George");
    String largest = myLinkedList.findLargest();
    System.out.println(largest);
    System.out.println(myLinkedList.get(0));
}}

我的解决方案(不起作用):嗯,我得到空指针异常。

import java.util.Iterator;
import java.util.LinkedList;


public class MyLinkedList extends LinkedList<String> {

Iterator<String> it = super.iterator();
String largest=it.next();

public String findLargest(){
    if (it.hasNext()==false){
        return largest;
    }
    else{
        String temp = it.next();
        int x=largest.compareTo(temp);
        if(x>0){
            largest=temp;
        }
        findLargest();
    }
    return largest;
}}

谁能告诉我我做错了什么?谢谢。

【问题讨论】:

  • largest 定义在哪里?
  • 请尽量使您的问题尽可能具体。 “它不起作用”不是问题。
  • 你所说的最大是什么意思 - 有最大长度?
  • 从 LinkedList 继承是一个非常非常糟糕的建议。
  • 不,它应该按字母顺序找到最大的。

标签: java recursion iterator linked-list compare


【解决方案1】:

这远非最佳解决方案,但此解决方案是通过修改您提供的代码。

import java.util.Iterator;
import java.util.LinkedList;

public class MyLinkedList extends LinkedList {

Iterator<String> it = null;
String largest="";

public String findLargest(){
    if (it == null) {
        it = super.iterator();
    }   

    if (it.hasNext()==false){
        it = null;
        return largest;
    }
    else{
        String temp = it.next();
        int x=largest.compareTo(temp);
        if(x<0){
            largest=temp;
        }
        findLargest();
    }
    return largest;
}}

【讨论】:

  • 这工作没有任何错误。但是当我运行它时显示两个名称。 “汤姆”和“莎拉”。难道是因为有两个return语句?
  • 它显示 sarah 因为 MyLinkedListDriver.java 有语句 System.out.println(myLinkedList.get(0));在里面。删除(注释掉)该语句,您不应该看到“sarah”。
  • @hbb:我仍然建议您检查我提出的解决方案。干净多了。您正在使用不应该使用的数据成员...
  • @Gj13 哦,我明白了。我不能感谢你。我已经尝试解决这个问题好几个小时了。当我无法弄清楚时偶然发现了这个网站。再次感谢。
  • @Eyal 但这不需要更改驱动程序类吗?编辑:没关系。我没有看到其他方法。
【解决方案2】:

问题在于您初始化类的方式:MyLinkedList ..

你有:

String largest=it.next();

在构造时,列表是空的,所以it 是空的。因此it.next() 为空;

【讨论】:

  • 我想我明白你的意思了。但我还能把它放在哪里?我不能把它放在递归方法中。
  • it.next() 当没有项目时不返回 null。它抛出 NoSuchElementException。
  • 将迭代器作为参数从外部传递给findLargets()
  • @Eyal 那么我应该改变什么?
  • @A4L U 的意思是来自驱动类?
【解决方案3】:

抱歉,我看不出您的代码如何抛出 NullPointerException。

它应该抛出 NoSuchElementException ,因为您尝试在构造时获取迭代器的第一项,此时集合仍然为空。这显然是一个错误。

关于如何解决这个问题的提示:迭代器不应该是数据成员。它没有描述对象的状态。考虑将迭代器的新实例传递给辅助方法,该方法是递归的:

public String findLargest(){
    return findLargest(iterator());
}

private static String findLargest(Iterator<String> it) {
    // Think how you implement this part recursively WITHOUT using any data member
}

【讨论】:

  • 你是绝对正确的。我很习惯看到 Nullpointerexceptions,我一定是看错了。谢谢。
  • 现在我想想,你提供的代码是有道理的。但是我应该在哪里声明迭代器。
  • @hbb:你不应该声明它。每当您调用 findLargest() 时,都会创建一个新的迭代器并将其传递给辅助方法。你只需要用正确的代码替换我的评论...
  • @hbb:你还在使用数据成员。您不需要“最大”作为属于实例的数据成员。将迭代器视为第一项和尾部的串联。最大值要么是第一项,要么是尾部的最大值。
  • 它适用于“最大”。现在我正试图让它在没有它的情况下工作。我猜我应该使用迭代器方法而不是变量。
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多