Реализация Trie

Я пытаюсь реализовать очень простой Trie в Java, который поддерживает 3 операции. Я хотел бы, чтобы это имело метод вставки, имеет метод (т.е. определенное слово в trie), и toString метод для возврата trie в строковой форме. Я полагаю, что у меня есть вставка, работающая правильно, но имеет, и toString оказываются трудными. Вот то, что я имею до сих пор.

trie класс.


public class CaseInsensitiveTrie implements SimpleTrie {

    //root node
    private TrieNode r;

    public CaseInsensitiveTrie() {
        r = new TrieNode();
    }

    public boolean has(String word) throws InvalidArgumentUosException {
        return r.has(word);
    }

    public void insert(String word) throws InvalidArgumentUosException {
        r.insert(word);
    }

    public String toString() {
        return r.toString();
    }

    public static void main(String[] args) {

        CaseInsensitiveTrie t = new CaseInsensitiveTrie();

        System.out.println("Testing some strings");
        t.insert("TEST");
        t.insert("TATTER");
        System.out.println(t.has("TEST"));
    }
}

И класс узла


public class TrieNode {

    //make child nodes
    private TrieNode[] c;
    //flag for end of word
    private boolean flag = false;

    public TrieNode() {
        c = new TrieNode[26]; //1 for each letter in alphabet
    }

    protected void insert(String word) {
        int val = word.charAt(0) - 64;

        //if the value of the child node at val is null, make a new node
                //there to represent the letter
        if (c[val] == null) {
            c[val] = new TrieNode();
        }

        //if word length > 1, then word is not finished being added.
        //otherwise, set the flag to true so we know a word ends there.
        if (word.length() > 1) {
            c[val].insert(word.substring(1));
        } else {
            c[val].flag = true;
        }
    }

    public boolean has(String word) {
        int val = word.charAt(0) - 64;
        if (c[val]!=null && word.length()>1) {
            c[val].has(word.substring(1));
        } else if (c[val].flag==true && word.length()==1) {
            return true;
        }

        return false;
    }

    public String toString() { 
        return "";
    }
}

Так в основном, при создании Trie, TrieNode создается как корень с 26 детьми. Когда вставка предпринята, к вставке обращаются, что корневой узел, который рекурсивно создает новый узел в правильном положении, и продолжается, пока слово не завершено. Я полагаю, что метод работает правильно.

Мой имеет функцию, очень повреждается, потому что у меня должен быть тот оператор возврата за пределами скобок по некоторым причинам. Я не могу содержать его в выражении else, или компилятор жалуется. Кроме этого, я думаю, что метод должен работать с некоторыми тонкими настройками, но я не могу понять это ни за что в жизни.

toString является зверем, которым я попытался заняться, но ничто, я бросаю в него работы, таким образом, я оставлю это быть, пока я не решу, не имеет проблему. Если я добираюсь, имеет работу I, могут изображать способ переформатировать его в функцию toString.

Цель интервала val = word.charAt (0) - 64; то, потому что каждая вводимая строка должна быть всеми заглавными буквами (я создам строковую функцию форматирования для обеспечения этого впоследствии), таким образом, международное значение первой буквы - 64 будет, это - положение в массиве. т.е. индекс массива 0 является A, таким образом, = 64, - 64 = 0. B = 65, B - 64 = 1, и так далее.

14
задан TAB 26 March 2019 в 11:35
поделиться

1 ответ

Ваша функция has , вероятно, должна выглядеть так:

if (c[val]!=null && word.length()>1) {
    return c[val].has(word.substring(1)); //<-- Change is on this line
} else if (c[val].flag==true && word.length()==1) {
    ...etc

Вы выполняете рекурсивный вызов, но вам действительно нужно позволить этому значению распространиться обратно к исходному вызывающему.

12
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: