2011-11-16 77 views
1

有一个LinkedQueueClass有3个要素:如何用字符串值搜索LinkedQueueClass

"ABC" 
"XYZ" 
"123" 

的元素中的LinkedListQueue是定制类类型StringElement其中有一个数据成员,它拥有一个字符串(字数据会员)。

StringElementhttp://pastebin.com/zh0t2X5K

当我尝试使用search()功能来搜索,实际上在队列中的boolean值返回是false存在的元素。意味着它无法找到元素。

Mainhttp://pastebin.com/vGegkcLZ

我在哪里出了错?

EDIT(代码从Pastebin.org链接如上所述。)

主要:

public class StringElement extends DataElement { 

    protected String word; 

    public StringElement(String str) 
    { 
     word = str; 
    } 

    public StringElement(StringElement otherElement) 
    { 
     word = otherElement.word; 
    } 

    @Override 
    public boolean equals(DataElement otherElement) { 
     StringElement temp = (StringElement) otherElement; 
     return (word == temp.word); 
    } 

    @Override 
    public int compareTo(DataElement otherElement) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public void makeCopy(DataElement otherElement) { 
     StringElement temp = (StringElement) otherElement; 
     word = temp.word; 
    } 

    @Override 
    public DataElement getCopy() { 
     StringElement temp = new StringElement(word); 
     return temp; 
    } 

    @Override 
    public String toString() 
    { 
     return String.valueOf(word); 
    } 

} 

StringElement:

import java.util.Scanner; 

public class Run { 
    public static void main(String args[]){ 
     LinkedQueueClass strQueue = new LinkedQueueClass();  

     strQueue.addQueue(new StringElement("ABC")); 
     strQueue.addQueue(new StringElement("XYZ")); 
     strQueue.addQueue(new StringElement("123")); 

     System.out.println(); 

     //ask user for a keyword to search for 
     System.out.print("Search keyword: "); 
     Scanner scan = new Scanner(System.in); 
     String userInput; 
     userInput = scan.next(); 

     //place the entered keyword into a StringElement and use it 
     //to search for the element with mathing keyword 
     StringElement keyword = new StringElement(userInput); 
     System.out.println(keyword.toString());//debugging: to confirm userInput value got stored in keyword object 
     System.out.println(strQueue.search(keyword));//search returns false 


    } 
} 

搜索()从UnorderedLinkedList:

public boolean search(DataElement searchItem) 
    { 
     Node current; //pointer to traverse the list 
      boolean found; 

      current = first; //set current pointing to the first 
                //node in the list 

       found = false; //set found to false 

       while(current != null && !found)    //search the list 
         if(current.info.equals(searchItem)) //item is found 
         found = true; 
         else 
           current = current.link; //make current point to 
                     //the next node 
       return found; 
    } 
+0

您构建的关键字对象是从搜索对象不同。您正尝试搜索不同的对象,但内容相同。 – r0ast3d

回答

0

解决方案

重写DataElement的抽象equals()方法,像这样:

public boolean equals(DataElement otherElement) { 
     StringElement temp = (StringElement) otherElement; 
     return (str.compareToIgnoreCase(temp.str) == 0); 
    } 
2

您的.equals实现使用==,它将检查值相等性,这正是您要查找的内容。

看来您在搜索方法中使用的.equals不是您所期望的。这就是为什么你不应该混合使用==和.equals功能。

以一致的引用平等方式实现您的.equals更安全,然后使用==在您的搜索方法中执行值相等性检查。

特别是,this是您使用.equals方法体验到的怪癖。你从对象覆盖的东西,而不是DataElement

+0

.equals来自UnorderedLinkedList类,它在search()里面的意思是? – Bob

+0

您的代码存在的问题是您实际上并没有在您的StringElement类中重写.equals。概念上的问题是,你正在使用.equals,你需要== –

+0

首先尝试用'public boolean equals(object otherElement)替换'public boolean equals(DataElement otherElement)'' –