Как искать LinkedQueueClass со строковым значением - PullRequest
1 голос
/ 17 ноября 2011

Есть LinkedQueueClass, который имеет 3 элемента:

"ABC" 
"XYZ" 
"123"

Элементы внутри LinkedListQueue имеют пользовательский тип класса StringElement, который имеет один элемент данных, он содержит строку (элемент данных word).

StringElement: http://pastebin.com/zh0t2X5K

Когда я пытаюсь использовать функцию search() для поиска элемента, который действительно существует в очереди, возвращаемое значение boolean равно false. Означает, что не может найти элемент.

Main: http://pastebin.com/vGegkcLZ

Где я ошибся?

РЕДАКТИРОВАТЬ (Код из ссылок Pastebin.org, упомянутых выше.)

Main:

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


    }
}

search () из 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;
    }

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Ваша реализация .equals использует ==, что проверит на равенство значений, и это то, что вы ищете.

Кажется, что .equals, которые вы используете в методе поиска, не тотвы ожидаете.Вот почему вы не должны смешивать функциональность == и .equals.

Безопаснее реализовать ваши .equals способом последовательного равенства ссылок, а затем использовать == для проверки равенства значений в вашем методе поиска.

В частности, это - это странность, которую вы испытываете при использовании метода .equals.Вы переопределяете что-то из объекта, а не из DataElement

0 голосов
/ 17 ноября 2011

Решение

Переопределение абстрактного метода equals () в DataElement, например:

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