まず、Trieノードを表すクラスを作成します。各ノードは文字、子ノードへの参照、および単語の終了を示すフラグを持つ必要があります。以下は、Trieノードのクラスの例です。
class TrieNode {
char ch;
Map<Character, TrieNode> children;
boolean isWordEnd;
public TrieNode(char ch) {
this.ch = ch;
this.children = new HashMap<>();
this.isWordEnd = false;
}
}
次に、Trieクラスを作成します。Trieクラスは、Trieの基本的な操作(挿入、検索、削除)を実装します。
class Trie {
private TrieNode root;
public Trie() {
this.root = new TrieNode('\0');
}
public void insert(String word) {
TrieNode current = root;
for (char ch : word.toCharArray()) {
current.children.putIfAbsent(ch, new TrieNode(ch));
current = current.children.get(ch);
}
current.isWordEnd = true;
}
public boolean search(String word) {
TrieNode current = root;
for (char ch : word.toCharArray()) {
if (!current.children.containsKey(ch)) {
return false;
}
current = current.children.get(ch);
}
return current.isWordEnd;
}
public boolean startsWith(String prefix) {
TrieNode current = root;
for (char ch : prefix.toCharArray()) {
if (!current.children.containsKey(ch)) {
return false;
}
current = current.children.get(ch);
}
return true;
}
}
上記の例では、Trieクラスに文字列の挿入(insert)、文字列の検索(search)、接頭辞の存在チェック(startsWith)のメソッドを実装しました。
以下は、Trieクラスの使用例です。
public class Main {
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("apple");
trie.insert("banana");
trie.insert("orange");
System.out.println(trie.search("apple")); // true
System.out.println(trie.search("grape")); // false
System.out.println(trie.startsWith("app")); // true
System.out.println(trie.startsWith("ora")); // false
}
}
この例では、"apple"、"banana"、"orange"の3つの単語をTrieに挿入し、検索と接頭辞の存在チェックを行っています。
以上が、JavaでのTrieデータ構造の実装方法についてのシンプルな例です。このコードは基本的な操作をカバーしており、必要に応じて拡張することができます。