Search code examples
javahashmaphashtable

Java HashTable: contains key can't find existing key


Imagining I have a dictionary.csv file:

"apple", "n.", "a red fruit"
"exercise", "n.", "sport"
"exercise", "v.", "play sport"

I have read it into type Hashtable<String, ArrayList<ArrayList>>:

content = {"apple":[["n", "a red fruit"]], "exercise"=[["n.", "sport"],["v.", "play sport"]]}

However, content.containsKey("apple") returns false. I tried hashmap and concurrentHashMap, not working as well.

Below is my code for Dictionary 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");
        }
    }
}


Below is my code in 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");
    }
}



Solution

  • I think you are inserting "apple" as a key and not apple. Remove double quotes. Change:

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

    To:

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