将带有重复单词的字典放入HashMap问题中

时间:2018-07-16 14:52:55

标签: java hashmap

我目前正在自学Java,因此决定要构建一个简单的程序,该程序读取具有几乎完整的字典的.txt文件,然后将这些条目放入HashMap中,以便用户可以输入单词然后接收定义这个词。

这里是将行放入HashMap中的方法。我的问题是像沙漠或沙漠这样的单词,我知道您不能使用HashMaps进行重复(开始时不要考虑拼写相同的单词)。我想我的真实问题是,可以使用其他数据结构来创建相同的结果吗?我不是在寻找这样做,以及如何输入答案。只是像use x数据结构这样的提示将是惊人的。 Here是指向的链接 gitrepo(如果需要的话)。预先谢谢你!

public static void createMap(File file) {
        try (FileReader fileReader = new FileReader(file);
                BufferedReader bufferedReader = new BufferedReader(fileReader);) {
            hold = bufferedReader.readLine();

            while (hold != null) {

                if (bufferedReader.readLine() != "") {
                    stringArray = hold.split(" ");
                    diction.put(stringArray[0].toLowerCase(), hold);
                    hold = bufferedReader.readLine();
                }

            }

        } catch (FileNotFoundException e) {
            System.out.println("Sorry could not find the proper file " + file);
        } catch (IOException e) {
            System.out.println("Sorry there was a problem with the program ");
        }

    }

3 个答案:

答案 0 :(得分:3)

您可以使用Hashmap<String, List<String>>,键为单词和包含不同含义的列表。

小代码示例:

// to create an empty dictionary
HashMap<String, List<String>> dictionaryMap = new HashMap<String, List<String>>();

// to add the word "exampleWord", with meaning "exampleMeaning"
if ( !dictionaryMap.containsKey("exampleWord")) {
    dictionaryMap.put("exampleWord",new ArrayList<String>());
}
dictionaryMap.get("exampleWord").add("exampleMeaning");

请注意,您应该将带有含义的代码段包装在方法中。

答案 1 :(得分:0)

我建议使用TreeMap<String, List<String> >代替HashMap。是的,我的答案与Bart's非常相似,因为HashMapTreeMap都实现了非常相似的API。但是,对于现实世界的字典,

  • 查看要查找的单词附近的单词通常很有用。这可以帮助您解决拼写错误。

  • 相关词的形式结尾与开头相比变化很大。因此,在查找过程中,按单词开头进行排序很有用。例如,对于大多数动词,仅列出不定式。

这将允许以下行为:

 /**
  * Shows the definitions of all words that start with the given letters.
  * @param start of the word
  */
 public void listStartingWith(String start) {
    // note that "zzz" does not occur in English, and z is the last letter;
    // therefore, start+zzz occurs after all valid words that start with 'start'
    for (Map.Entry<String, List<String>> e : map.subMap(start, start+"zzz")) {
       showDefinition(e.getKey());
    }
 }

答案 2 :(得分:0)

这是一个完整的程序,可以满足您的需求。您应该使用dotTapped(index:)类型的映射,以便字符串可以映射到多个定义。当您遇到一个单词时,请检查该单词是否已在词典中。如果是这样,请附加到定义列表,否则创建一个新列表。

我还更改了返回类型,因此该函数始终返回一个映射,因此您无需修改​​静态变量。

我改用Map<String, List<String>>是因为它保持顺序。您的列表碰巧已排序,但是如果单词列表未排序,则哈希表将不会使您的单词按字母顺序排序。树形图将会。

最后,使用java.util.TreMap逐行读取文件要容易得多。

java.util.Scanner

输入(文件的较短版本):

import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import java.util.List;
import java.util.LinkedList;

class Dictionary {

  public static Map<String, List<String>> createMap(File file) throws Exception {

    Scanner      fileReader;
    int          firstSpace;
    String       line;
    String       word;
    String       definition;
    List<String> definitions;
    Map<String, List<String>> dictionary;

    // Use a tree map to keep sorted
    // even if your word list is not sorted
    dictionary = new TreeMap<>();
    fileReader = new Scanner(file);

    // Loop through file line by line
    while (fileReader.hasNextLine()) {

      // Get each line
      line = fileReader.nextLine();

      // Avoid empty lines
      if (!line.equals("")) {

        // Split the word and definition
        // by finding the index of the first space
        firstSpace = line.indexOf(' ');
        word       = line.substring(0, firstSpace);
        definition = line.substring(firstSpace + 1);

        // If the dictionary already contains
        // the word, then add to the list of
        // definitions
        if (dictionary.containsKey(word)) {

          definitions = dictionary.get(word);

          definitions.add(definition);

        // Otherwise make a new list
        // of definitions and insert it's
        // first entry
        } else {

          definitions = new LinkedList<>();

          definitions.add(definition);
        }

        // Insert / updated the word and
        // it's list of definitions
        dictionary.put(word, definitions);
      }


    }

    // Close when done
    fileReader.close();

    return dictionary;
  }

  public static void main(String[] args) {

    File file;
    Map<String, List<String>> dictionary;

    // Read file into map
    // then print each entry
    // on to a new line
    try {

      file       = new File("dictionary.txt");
      dictionary = createMap(file);

      Iterable entries = dictionary.entrySet();

      for (Object entry : entries) {

        System.out.println(entry);
      }

    } catch (Exception e) {

      e.printStackTrace();

      System.exit(1);
    }

  }

}

输出:

A prefix (also an- before a vowel sound) not, without (amoral). [greek]

Aa  abbr 1 automobile association. 2 alcoholics anonymous. 3 anti-aircraft.

Aa some other stuff
Aa more stuff

Aardvark  n. Mammal with a tubular snout and a long tongue, feeding on termites. [afrikaans]