比较字符串与空对象

问题描述:

我有一个非常简单的问题,我无法理解应该如何进一步移动。比较字符串与空对象

我有一个双向链表,其中第一个节点是空对象,最后一个节点是空对象。

而且我想要在第一个和最后一个节点之间插入各种字符串元素。例如,我有字符串元素“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

你从未问过一个问题,所以不,问题不清楚。

它可能是“如何确定对象是否为空?”答案:

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

你不能比较空与对象,为空不是一个对象。见Is null an Object?。为什么你想要这些“NullObjects”呢?

+0

只有在第一种情况下,它必须是空对象。因为这是项目的一部分 – ferhan 2012-02-19 12:14:25

如果您正确实施空对象模式,然后,而不是做这样

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

    //logic 

    } 

你应该这样做

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

    //logic 

    } 

提供给被覆盖的equals和hashCode适当。

空对象应该是对象而不是null(对于Java) - 这是该模式的主要意图。你需要有一些你的数据类的子类,它本质上“什么都不做”(参见this article,C++或C#示例很好地为你提供了关于应该在Java中完成什么的线索)并且不代表任何类型的有效对象在你的域名中。