2015-05-02 3 views
0

Целью этой функции является получение пользовательского ввода для поиска слова, которое было добавлено в двоичное дерево поиска. Затем, используя наш алгоритм поиска в BST, если слово найдено, распечатайте частоту слова. Мой подход состоял в том, чтобы принять пользовательский ввод и создать новый объект Word, а затем использовать функцию tree.search - BST, чтобы найти слово, но это не находит слово. Я не уверен, должен ли я даже создавать новый объект Word из пользовательского ввода, поэтому я думаю, что моя ошибка там.Поиск объекта Word в дереве двоичного поиска

Вот мой Основной подход:

public static void search(BST tree){ 
    Scanner input = new Scanner(System.in); 
    System.out.print("Search For: "); 
    Word searchWord = new Word(input.next()); 

    if (tree.search(searchWord) == null){ 
     System.out.println("Value was not found."); 
    }else{ 
     System.out.println(searchWord.getFrequency()); 
    } 
} 

Это мой класс Слово:

public class Word { 
    private String word; 
    private int frequency; 

    public Word(String w, int f){ 
     word = w; 
     frequency = f; 
    } 
    public Word(String w){ 
     word = w; 
    } 
    public void increment(){ 
     frequency++; 
    } 
    public String getWord(){ 
     return word; 
    } 
    public int getFrequency(){ 
     return frequency; 
    } 
    public int compareTo(Word w){ 
     return word.compareTo(w.getWord()); 
    } 
    @Override 
    public String toString(){ 
     return word +" "+ frequency; 
    } 
} 

Вот мой поиск BST алгоритм:

public Node search(Word w){ 
    if (root == null){ 
     System.out.println("No items to search."); 
     return null; 
    }else{ 
     return search(w,root); 
    } 
} 
private Node search(Word w, Node n){ 
    if (w == n.getData()){ 
     return n; 
    } 
    if (w.compareTo(n.getData()) < 0){ 
     if(n.getLeft() == null){ 
      System.out.println("Item not found."); 
      return null; 
     }else{ 
      return search(w, n.getLeft()); 
     } 
    }else{ 
     if (n.getRight() == null){ 
      System.out.println("Item not found."); 
      return null; 
     }else{ 
      return search(w, n.getRight()); 
     } 
    } 
} 

ответ

1

Есть две проблемы в вашей код.

  1. Выполнение сравнения с указателем: if (w == n.getData()). Вы хотите сравнить данные внутри объектов, поэтому вместо этого напишите if (w.equals(n.getData())).

  2. Но теперь вам необходимо переопределить Word.equals() так, чтобы он возвращал true всякий раз, когда две вложенные строки имеют одинаковое содержимое. Как это:

    public boolean equals(Object other) { 
        if (!(other instanceof Word)) 
         return false; 
        return word.equals(((Word)other).word); 
    } 
    
+0

В каком классе будет код размещен во втором номере идти? Слово или класс BST? – JCCS

+0

"теперь вам все равно нужно переопределить Word.equals()" – Nayuki

Смежные вопросы