2012-02-19 91 views
0

我有一個非常簡單的問題,我無法理解應該如何進一步移動。比較字符串與空對象

我有一個雙向鏈表,其中第一個節點是空對象,最後一個節點是空對象。

而且我想要在第一個和最後一個節點之間插入各種字符串元素。例如,我有字符串元素「C」,「D」,「A」,「P」。

並插入到雙向鏈表後。我需要一些插入順序喜歡這個 -

FirstNullObject P d C A LastNullObject

所以我不知道我應該怎麼比較,我想比較,不斷加入各種串空對象。假設我首先添加C,然後以某種方式將C插入這兩個空對象之間。然後,如果我加入d然後我有C到比較d,然後列表想這 -

FirstNullObject dÇLastNullObject

這裏NEWLINK就像C,d的newNode和firstNode是空對象。但這不起作用。我總是得到一個異常。

if (newLink.data.compareToIgnoreCase(list.firstNode.data) > 0) { 

     //logic 

     } 

我希望問題是明確

+0

你有沒有得到NullPointerException?我只能假定你使用了錯誤的NullObjectPattern,並且比較了字符串數據和對象本身:'newLink.compareToIgnoreCase(list.firstNode)'來實現Comparable。 – mishadoff 2012-02-19 12:10:39

+0

是的,我得到了NPE。但這不可能,因爲firstNode不是字符串。它是一個NewLink數據類型。 – ferhan 2012-02-19 12:13:36

+0

你可能想看看Ruby - nulls(nils)是那裏的對象,NilClass – 2012-02-19 12:27:46

回答

3

你從未問過一個問題,所以不,問題不清楚。

它可能是「如何確定對象是否爲空?」答案:

o == null 

它可能是「我怎麼能確定我在鏈接列表的末尾?」答案是:當下一個節點爲空時,有最終節點。

它可能是「我如何表示鏈表中的末端節點節點?」答案是:它與任何節點相同,但引用列表中下一個節點的字段爲空。

它可能是「我怎麼能有一個既可以是列表節點又可以是空的域?我需要一些神奇的NodeNull,或者......?「答案:該字段只有節點的類型,並且您將其指定爲空。請閱讀section 4.1

它可能是」我怎樣纔能有一個既可以是列表的字符串成員又可以是字符串成員的字段,有時候,還有一些特殊的價值,可以作爲列表的一個哨兵?「答案:呃,什麼?節點的'價值'字段與列表的結構完全沒有關係,你問這個問題建議您在代碼的荒野中出路,並且應該參考您的課程材料,瞭解您要處理的內容。

我知道您提到了雙向鏈表;無這些答案的變化對他們來說是的,我認爲上面的任何一個都可以成爲你正在尋找的答案

編輯:

和firstNode是空對象

是啊,你出在曠野。

  1. 你的哨兵不是一個節點,除了技術上。

  2. 您的Sentinel沒有,你是在越來越感興趣的一個領域。數據

  3. 你實際上是在這裏做什麼 - 或者半做的,當你的錯誤 - 是attemping具有特殊的列表的「第一」和「最後」和「中間」節點。三種不同的節點,也許你也想過一個'空列表'對象。既然這是愚蠢的,可能你只是因爲你不明白你要做什麼。

什麼你做的是不如說更像

class Cons { 
    public String data; 
    public Cons prev; 
    public Cons next; 
    Cons(String data, Cons prev, Cons next) { ... } 
} 

空列表:空

一個一成員名單,新的缺點( 「A」,NULL,NULL) ;

三人名單:

Cons list = new Cons("a", null, null); 
list.next = new Cons("b", list, null); 
list.next.next = new Cons("c", list.next, null); 

正如沒有什麼太大的變化,當你從一個鏈接到雙向鏈表移動,當你從Java的提供的缺點的特殊亞型移動沒有什麼太大的變化(即是,null)到你自己的子類型。

+2

+1努力 – Vic 2012-02-19 13:42:43

0

你不能比較空與對象,爲空不是一個對象。見Is null an Object?。爲什麼你想要這些「NullObjects」呢?

+0

只有在第一種情況下,它必須是空對象。因爲這是項目的一部分 – ferhan 2012-02-19 12:14:25

1

如果您正確實施空對象模式,然後,而不是做這樣

if (newLink.data.compareToIgnoreCase(list.firstNode.data) > 0) { 

    //logic 

    } 

你應該這樣做

if (newLink.equals(list.firstNode)) { 

    //logic 

    } 

提供給被覆蓋的equals和hashCode適當。

1

空對象應該是對象而不是null(對於Java) - 這是該模式的主要意圖。你需要有一些你的數據類的子類,它本質上「什麼都不做」(參見this article,C++或C#示例很好地爲你提供了關於應該在Java中完成什麼的線索)並且不代表任何類型的有效對象在你的域名中。