如何在多值 HashMap 中查找键?

How to find a key in a multiple-value HashMap?

我的任务是使用 HashMap 和 Sets 制作一个同义词字典。 我的主要方法中有以下代码:

public static void main(String[] args) {

        addSynonym("casa", "imobil");
        addSynonym("casa", "cladire");
        addSynonym("casa", "locuinta");
        addSynonym("casa", "camin");
        addSynonym("casa", "domiciuliu");

        addSynonym("jucarie", "joc");
        addSynonym("jucarie", "marioneta");
        addSynonym("jucarie", "papusa");
        addSynonym("jucarie", "pantin");

        addSynonym("om", "barbat");
        addSynonym("om", "persoana");

        afisarearray(getSynonyms("camin"));
    }

一种插入同义词和键的方法:

static Map<String, ArrayList<String>> synonymTable = new HashMap<String, ArrayList<String>>();

    public static void addSynonym(String word, String synonym) {
        ArrayList<String> checklist = synonymTable.get(word);
        if (checklist == null) {
            ArrayList<String> temporarylist = new ArrayList<String>();
            temporarylist.add(synonym);

            synonymTable.put(word, temporarylist);
        } else {
            synonymTable.get(word).add(synonym);
        }
    }

显示 ArrayList 的一种方法:

    public static void afisarearray(ArrayList<String> list) {
        if (list != null) {
            for (String s : list) {
                System.out.println(s + "\n");
            }
        } else {
            System.out.println("Empty list");
        }
    };

我想找到一个词的所有同义词,例如“camin”这个词。我编写了以下方法来执行此操作,但它不起作用,它返回一组空键:

public static ArrayList<String> getSynonyms(String word) {
        if (word == "") {
            System.out.println("No word to serach for ");
            return null;
        } else {

            Set<String> keySet = new HashSet<String>();

            for (Map.Entry<String, ArrayList<String>> entry : synonymTable.entrySet()) {
                if (entry.getValue().equals(word)) {
                    keySet.add(entry.getKey());
                }
            }

            if (keySet.isEmpty()) {
                System.out.println("No keys found");
                return null;
            } else {

                ArrayList<String> newlist = new ArrayList<String>();

                for (String s : keySet) {
                    newlist.addAll(synonymTable.get(s));
                }
                return newlist;
            }
        }
    }

问题出在这里面 if:

if (entry.getValue().equals(word))

是ArrayList和字符串之间的比较。 不知道怎么修改。

试试这个,我还稍微清理了你的代码以提高可读性

public static List<String> getSynonyms(String word) {
    if (word == null || word.trim().isEmpty()) {
        System.out.println("No word to serach for ");
        return null;
    }

    Set<String> keySet = new HashSet<String>();

    for (Map.Entry<String, List<String>> entry : synonymTable.entrySet()) {
        if (entry.getValue().contains(word)) {
            keySet.add(entry.getKey());             
        }
    }

    if (keySet.isEmpty()) {
        System.out.println("No keys found");
        return null;
    }
    
    //de-dupe and sort
    Collection<String> terms = new TreeSet<>();

    for (String s : keySet) {
        terms.addAll(synonymTable.get(s));
    }
    
    return new ArrayList<>(terms);
}