Java пытается обойтиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java пытается обойти

Сообщение Anonymous »

Я пытался написать код для определения количества слов в массиве, имеющем определенный префикс, используя структуру данных Trie в Java. Я нашел код Java от Claude AI, который дает правильный результат при выполнении. Но у меня есть сомнение, от выяснения которого никуда не денешься. После этих абзацев идет речь о коде Java. Здесь мой вопрос связан с тем, когда для флага «isEndOfWord» установлено значение true. Насколько я понимаю, внутри функции «insertTriesEntries» на каждой итерации цикла For Each объект curr обновляется, чтобы указать на значение символьного ключа, вставленного в эту итерацию. Согласно коду, это значение всегда является новым узлом Trie, который вставляется в хэш-карту объекта curr, как значение ключа, вставленного в эту хэш-карту.
Теперь, например, мое слово, которое нужно проверить на наличие префикса и вставить в Trie, — это «дружба». После вставки последнего символа «y» строка кода curr = curr.trieEntry.get(x); будет выполнена, и моя ссылочная переменная curr начнет указывать на объект, сохраненный как значение ключа «y». Теперь флаг этого объекта «isEndOfWord» будет установлен в истинное значение. Он не сделает переменную флага «isEndOfWord» объекта, имеющего хэш-карту, содержащую ключ «y», также истинной. Но кажется, что другие функции в программе работают, учитывая, что флаг «isEndOfWord» для объекта, имеющего хэш-карту, содержащую ключ «y», является истинным.
import java.util.HashMap;

class Tries {
HashMap trieEntry = new HashMap();
boolean isEndOfWord = false;
}

public class tempTrie {
static Tries root = new Tries();
String prefix = "am";
static int count = 0;

public static void insertTrieEntries(String word) {
Tries curr = root;
for (char x : word.toCharArray()) {
if (!curr.trieEntry.containsKey(x)) {
curr.trieEntry.put(x, new Tries());
}
curr = curr.trieEntry.get(x);
}
curr.isEndOfWord = true;
}

public static int countWordsWithPrefix(String prefix) {
Tries curr = root;
// Navigate to the end of the prefix in the trie
for (char x : prefix.toCharArray()) {
if (!curr.trieEntry.containsKey(x)) return 0;
curr = curr.trieEntry.get(x);
}
// DFS count all words under this node
return dfsCount(curr);
}

private static int dfsCount(Tries node) {
// int count = node.isEndOfWord ? 1 : 0;
// for (Tries child : node.trieEntry.values()) {
// count += dfsCount(child);
// }
// return count;
if(node.isEndOfWord) {
count++;
}
for(Tries x: node.trieEntry.values()) {
dfsCount(x);
}
return count;
}

public int checkEachWord(String[] arr) {
root = new Tries(); // reset trie
for (String word : arr) {
insertTrieEntries(word);
}
return countWordsWithPrefix(prefix);
}

public static void main(String[] args) {
tempTrie obj = new tempTrie();
String[] arr = {"amity", "amitus", "amitusq", "amitu"};
System.out.println(obj.checkEachWord(arr));
//Output : 4
}
}
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»