Java 为什么这个变量在trie数据结构插入方法中?
我在拼写检查器程序中使用了trie数据结构。我使用了一种方法Java 为什么这个变量在trie数据结构插入方法中?,java,data-structures,trie,Java,Data Structures,Trie,我在拼写检查器程序中使用了trie数据结构。我使用了一种方法insertWord将文本文件中的单词插入到我在网上找到的trie结构中,但我不明白为什么要使用变量offset。为什么它要从字符数组字母[i]中减去一个整数?程序运行正常。我只是想进一步了解一下代码。任何帮助都将不胜感激 import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public c
insertWord
将文本文件中的单词插入到我在网上找到的trie结构中,但我不明白为什么要使用变量offset
。为什么它要从字符数组字母[i]
中减去一个整数?程序运行正常。我只是想进一步了解一下代码。任何帮助都将不胜感激
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class spellChecker {
static TrieNode createTree()
{
return(new TrieNode('\0', false));
}
static void insertWord(TrieNode root, String word)
{
int offset = 97;
int l = word.length();
char[] letters = word.toCharArray();
TrieNode curNode = root;
for (int i = 0; i < l; i++)
{
if (curNode.links[letters[i]-offset] == null)
curNode.links[letters[i]-offset] = new TrieNode(letters[i], i == l-1 ? true : false);
curNode = curNode.links[letters[i]-offset];
}
}
static boolean find(TrieNode root, String word)
{
char[] letters = word.toCharArray();
int l = letters.length;
int offset = 97;
TrieNode curNode = root;
int i;
for (i = 0; i < l; i++)
{
if (curNode == null)
return false;
curNode = curNode.links[letters[i]-offset];
}
if (i == l && curNode == null)
return false;
if (curNode != null && !curNode.fullWord)
return false;
return true;
}
private static String[] dictionaryArray;
public String[] dictionaryRead() throws Exception
{
// Find and read the file into array
String token = "";
// Use scanner for input file
Scanner dictionaryScan = new Scanner(new File("dictionary2.txt")).useDelimiter("\\s+");
List<String> dictionary = new ArrayList<String>();
//Check for next line in text file
while (dictionaryScan.hasNext())
{
token = dictionaryScan.next();
dictionary.add(token);
}
dictionaryScan.close();
dictionaryArray = dictionary.toArray(new String[0]);
return dictionaryArray;
}
public static void main(String[] args) throws Exception
{
spellChecker spellcheck = new spellChecker();
spellcheck.dictionaryRead();
TrieNode tree = createTree();
for (int i = 0; i < dictionaryArray.length; i++)
insertWord(tree, dictionaryArray[i]);
Scanner inputFileScan = new Scanner(new File("test.txt")).useDelimiter("\\s+");
//Check for next line in text file,
//then write arraylist to trie data structure
boolean mispelled = false;
while (inputFileScan.hasNext())
{
String word = inputFileScan.next();
if (!find(tree, word))
{
System.out.println("Mispelled word: " + word);
mispelled = true;
}
}
inputFileScan.close();
if(mispelled == false)
{
System.out.println("There are no errors.");
}
}
}
class TrieNode
{
char letter;
TrieNode[] links;
boolean fullWord;
TrieNode(char letter, boolean fullWord)
{
this.letter = letter;
links = new TrieNode[100];
this.fullWord = fullWord;
}
}
导入java.io.File;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
公共类拼写检查器{
静态三节点createTree()
{
返回(新的三节点('\0',false));
}
静态void insertWord(三节点根、字符串字)
{
整数偏移=97;
int l=单词长度();
char[]字母=word.toCharArray();
三节点curNode=根;
对于(int i=0;i
97在ASCII表格中是“a”。所以变量offset
用于将字符“a”作为第一个字符处理(就像我们在字母表中所做的那样)97
是字符'a'
的数值。当您希望获得与字符字母[i]
对应的链接
数组的索引时,您必须从该字符中减去97
,以便'a'
映射到索引0,'b'
映射到1,'z'
映射到25。现在就更有意义了!非常感谢!