【问题标题】:Java HashTable: contains key can't find existing key [closed]Java HashTable:包含密钥找不到现有密钥[关闭]
【发布时间】:2021-06-23 22:57:24
【问题描述】:

假设我有一个 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") 返回 false。我试过hashmap和concurrentHashMap,还是不行。

下面是我的 Dictionary 类代码。

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 类中的代码。

import java.io.FileNotFoundException;

public class Main {
    public static void main(String ars[]) throws FileNotFoundException {
        Dictionary dictionary = new Dictionary("dictionary.csv");
        dictionary.getMeaning("apple");
    }
}


【问题讨论】:

  • 永远不要在新代码中使用Hashtable。请改用MapHashMap。 (并将您的变量声明为 Map&lt;String, List&lt;List&lt;String&gt;&gt;&gt; 或类似的,而不是使用特定的集合类型。)
  • 我认为您插入的是 "apple" 作为键,而不是 apple。删除双引号。
  • 使用现有的库来读取 CSV,不要自己解析,会导致类似这样的问题。
  • 我第二个 @MarkRotteveel 并且还想指出数据看起来不一致,例如在"apple" 之后,你有一个: 作为分隔符,而在"exercise" 之后,你有一个= 作为分隔符。

标签: java hashmap hashtable


【解决方案1】:

我认为您插入的是"apple",而不是apple。删除双引号。 变化:

String word = values[0].toLowerCase();

收件人:

String word = values[0].toLowerCase();
word = word.substring(1, word.length()-1);

【讨论】:

  • 但请注意,这将删除键中的所有引号,而不仅仅是第一个和最后一个引号
【解决方案2】:

您好问题在于输入应该是 content.containsKey("\"apple\"") 不是 content.containsKey("apple") 或删除 dictionary.csv 文件中的 "。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2022-01-24
    • 2015-02-17
    • 2021-09-22
    • 2018-11-18
    • 2019-05-10
    • 2017-02-26
    相关资源
    最近更新 更多