Java 为什么这个变量在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

我在拼写检查器程序中使用了trie数据结构。我使用了一种方法
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。

现在就更有意义了!非常感谢!