Java 哈希表:包含键找不到现有键
Java HashTable: contains key can't find existing key
假设我有一个 dictionary.csv 文件:
"apple", "n.", "a red fruit"
"exercise", "n.", "sport"
"exercise", "v.", "play sport"
我已经读入类型 Hashtable>:
content = {"apple":[["n", "a red fruit"]], "exercise"=[["n.", "sport"],["v.", "play sport"]]}
然而,content.containsKey("apple") returns 错误。我尝试了 hashmap 和 concurrentHashMap,但效果不佳。
下面是我的字典代码 class。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
public class Dictionary {
private String filename;
private Hashtable<String, ArrayList<ArrayList<String>>> content = new Hashtable<>();
public Dictionary(String filename) throws FileNotFoundException {
// set the file name
this.filename = filename;
// read dictionary file into content
try (BufferedReader br = new BufferedReader((new FileReader(filename)))) {
String line;
// read every line
while ((line = br.readLine()) != null){
String[] values = line.split(",");
assert(values.length == 3);
// split word,
String word = values[0].toLowerCase();
ArrayList<String> meaning = new ArrayList<>();
meaning.add(values[1]);
meaning.add(values[2]);
// add word and meaning to the content
if (content.containsKey(word)){
ArrayList newMeanings = content.get(word);
newMeanings.add(meaning);
content.put(word, newMeanings);
}
else {
ArrayList<ArrayList<String>> meanings = new ArrayList<>();
meanings.add(meaning);
content.put(word, meanings);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void getMeaning(String rawWord){
String word = rawWord.toLowerCase();
if (content.containsKey(word)){
ArrayList<ArrayList<String>> meanings = content.get(word);
int numMeanings = meanings.size();
for (int i = 0; i < numMeanings; i++){
String[] meaningLst = (String[]) meanings.get(i).toArray();
System.out.println("Meaning " + (i+1) + ": " + meaningLst[0] + ". " + meaningLst[1]);
}
}
else {
System.out.println("Word not found");
}
}
}
下面是我在 Main class 中的代码。
import java.io.FileNotFoundException;
public class Main {
public static void main(String ars[]) throws FileNotFoundException {
Dictionary dictionary = new Dictionary("dictionary.csv");
dictionary.getMeaning("apple");
}
}
我认为您插入的是 "apple"
作为键而不是 apple
。删除双引号。
变化:
String word = values[0].toLowerCase();
收件人:
String word = values[0].toLowerCase();
word = word.substring(1, word.length()-1);
您好问题出在输入上,它应该是 content.containsKey("\"apple\"") 而不是
content.containsKey("apple") 或请删除 dictionary.csv 文件中的 "。
假设我有一个 dictionary.csv 文件:
"apple", "n.", "a red fruit"
"exercise", "n.", "sport"
"exercise", "v.", "play sport"
我已经读入类型 Hashtable
content = {"apple":[["n", "a red fruit"]], "exercise"=[["n.", "sport"],["v.", "play sport"]]}
然而,content.containsKey("apple") returns 错误。我尝试了 hashmap 和 concurrentHashMap,但效果不佳。
下面是我的字典代码 class。
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
public class Dictionary {
private String filename;
private Hashtable<String, ArrayList<ArrayList<String>>> content = new Hashtable<>();
public Dictionary(String filename) throws FileNotFoundException {
// set the file name
this.filename = filename;
// read dictionary file into content
try (BufferedReader br = new BufferedReader((new FileReader(filename)))) {
String line;
// read every line
while ((line = br.readLine()) != null){
String[] values = line.split(",");
assert(values.length == 3);
// split word,
String word = values[0].toLowerCase();
ArrayList<String> meaning = new ArrayList<>();
meaning.add(values[1]);
meaning.add(values[2]);
// add word and meaning to the content
if (content.containsKey(word)){
ArrayList newMeanings = content.get(word);
newMeanings.add(meaning);
content.put(word, newMeanings);
}
else {
ArrayList<ArrayList<String>> meanings = new ArrayList<>();
meanings.add(meaning);
content.put(word, meanings);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void getMeaning(String rawWord){
String word = rawWord.toLowerCase();
if (content.containsKey(word)){
ArrayList<ArrayList<String>> meanings = content.get(word);
int numMeanings = meanings.size();
for (int i = 0; i < numMeanings; i++){
String[] meaningLst = (String[]) meanings.get(i).toArray();
System.out.println("Meaning " + (i+1) + ": " + meaningLst[0] + ". " + meaningLst[1]);
}
}
else {
System.out.println("Word not found");
}
}
}
下面是我在 Main class 中的代码。
import java.io.FileNotFoundException;
public class Main {
public static void main(String ars[]) throws FileNotFoundException {
Dictionary dictionary = new Dictionary("dictionary.csv");
dictionary.getMeaning("apple");
}
}
我认为您插入的是 "apple"
作为键而不是 apple
。删除双引号。
变化:
String word = values[0].toLowerCase();
收件人:
String word = values[0].toLowerCase();
word = word.substring(1, word.length()-1);
您好问题出在输入上,它应该是 content.containsKey("\"apple\"") 而不是 content.containsKey("apple") 或请删除 dictionary.csv 文件中的 "。