我目前正在自学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 ");
}
}
答案 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非常相似,因为HashMap
和TreeMap
都实现了非常相似的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]