map.get(key)返回true而不是value

时间:2018-05-16 22:09:27

标签: java

这是我第一次在这个网站上询问,所以希望我没有弄乱任何格式化。无论如何,我在从地图中获取键/值对的值时遇到了一些麻烦。 我最初将密钥(可能很多字符串中的一个字符串“word”)与一个抽象的HashSet配对以保存“word” 但是,当我尝试打印出与键配对的值时,我希望它能够返回该集合。我收到“真实”。 关于如何打印出一组单词的任何建议?我是否必须使该集合非抽象才能生效?

提前感谢您的帮助!

/**
 * Method that is used to load a file containing a list of words
 *
 * @param fileName the name of the file containing words
 *                 either is .txt or .csv format
 */
@Override
public void initialize(String fileName) {
    File file = new File(fileName);
    String word;

    try {
        Scanner scan = new Scanner(file);
        while (scan.hasNext()) {
            word = scan.next();

            for (int i = 0; i <= word.length(); i++) {
                wordMap.putIfAbsent(word.substring(0, i), new HashSet<>().add(word));

                System.out.println(wordMap.get(word.substring(0, i)));
                }
            }
        } catch(IOException e){
          //Exception handling stuff
        }
    }

3 个答案:

答案 0 :(得分:2)

以下是HashSet.add的{​​{3}}:

  

public boolean add(E e)

     

如果指定的元素尚不存在,则将其添加到此集合中。更正式地,如果此集合不包含元素e2(e == null?e2 == null:e.equals(e2)),则将指定元素e添加到此集合。如果此set已包含该元素,则调用将保持set不变并返回false。

换句话说,new HashSet<>().add(word)始终是布尔true,这就是你要添加的内容。

要在一个表达式中创建一个包含一个元素的新HashSet,可以使用new HashSet<>(Collections.singleton(word))

答案 1 :(得分:0)

您的地图应声明为:

Map<String,Set<String>> wordMap = new HashMap<>();

然后在你的循环中:

String key = word.subString(0, i);
wordMap.putIfAbsent(key, new HashSet<>());
wordMap.get(key).add(word);

答案 2 :(得分:0)

当你尝试新的Hashset时,它返回boolean,它本身就会产生编译错误。你可以尝试这样做:

for (int i = 0; i <= word.length(); i++) {
            HashSet<String> hs=new HashSet<>();
            hs.add(word);
            wordMap.putIfAbsent(word.substring(0, i), hs);
           // wordMap.putIfAbsent(word.substring(0, i), new HashSet<>().add(word));

            System.out.println(wordMap.get(word.substring(0, i)));
         }