2013-03-03 54 views
0

編輯:我更新了線程以回答您的一些問題。這是一個編程任務。我的解決方案不起作用: 要回答關於此主題的評論,應該按字母順序查找最大的字符串。例如「湯姆」比「安迪」大。Java - 返回鏈表中的最大字符串

編寫一個遞歸方法來查找單向鏈表中的最大值。繼承LinkedList類並添加遞歸方法。您將需要使用迭代器來訪問鏈表的每個節點。您可能需要添加一個輔助方法來啓動遞歸。使用驅動程序類填充鏈接列表並證明您的方法有效。向驅動程序類添加額外的測試。 提供的駕駛員級別中最大的是湯姆。

提供的驅動程序類:

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; 
}} 

有人能告訴我我做錯了什麼嗎?謝謝。

+1

「最大」定義在哪裏? – 2013-03-03 22:06:51

+0

請儘量讓您的問題儘可能具體。 「不起作用」不是問題。 – jrajav 2013-03-03 22:06:53

+0

你是什麼意思最大 - 有最大長度? – 2013-03-03 22:07:09

回答

0

這遠非最佳解決方案,但此解決方案是通過修改您提供的代碼。

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; 
}} 
+0

這工作沒有任何錯誤。但是當我運行它時會顯示兩個名字。 「湯姆」和「莎拉」。難道是因爲有兩個返回語句? – hbb 2013-03-03 22:51:19

+0

它顯示sarah,因爲MyLinkedListDriver。java有語句System.out.println(myLinkedList.get(0));在裏面。刪除(註釋掉)該陳述,你不應該看到「莎拉」。 – GJ13 2013-03-03 22:54:03

+1

@hbb:我仍然建議您檢查我提議的解決方案。它更乾淨。你正在使用的數據成員,你不應該... – 2013-03-03 22:58:29

0

的問題是您初始化類的方式:MyLinkedList ..

您有:

String largest=it.next(); 

在構造時,該列表是空的,所以it是空的。因此it.next()爲空;

+0

我想我知道你的意思。但我還能在哪裏放?我不能把它放在遞歸方法中。當沒有項目不返回null時,it.next()會返回 – hbb 2013-03-03 22:38:18

+0

。它拋出NoSuchElementException。 – 2013-03-03 22:41:44

+0

將迭代器作爲參數傳遞給外部的'findLargets()' – A4L 2013-03-03 22:43:08

0

對不起,我看不到你的代碼如何拋出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 
} 
+0

你是絕對正確的。我很習慣看到Nullpointerexceptions,我一定誤解了它。謝謝。 – hbb 2013-03-03 22:53:53

+0

現在我想一想,你提供的代碼是合理的。但我應該在哪裏聲明迭代器。 – hbb 2013-03-03 23:05:25

+0

@hbb:你不應該聲明它。無論何時調用findLargest(),都會創建一個新的迭代器並將其傳遞給輔助方法。你只需要用正確的代碼替換我的評論... – 2013-03-03 23:12:12