【问题标题】:LinkedList as value for HashtableLinkedList 作为 Hashtable 的值
【发布时间】:2016-02-22 13:13:21
【问题描述】:

我创建了一个哈希表,其中一个字符串作为键,一个字符串的 LinkedList 作为我的值。这是我的实现:

 Hashtable <String, LinkedList<String>> table = new Hashtable <String, LinkedList<String>>();

我想要做的是对一个单词文件进行排序,并将每个排序后的单词存储到哈希表中(代表键),并将 ORIGINAL 单词存储为我的 LinkedList 值的一部分。

例如,如果单词是

"cat"
 Sorted = "act"
 Store in Hashtable (key : act, value : cat);

现在我只是对如何从本质上添加到我的 LinkedList 感到困惑。

这就是我的想法:

 LinkedList <String> temp = table.get(sortedWord) //if null, then nothing in list
 if(temp==null) 
     table.put(sortedWord,temp.add(originalWord));

 This is not working since its not following the library functions but I'm unsure of how I would do this.

【问题讨论】:

  • 如果你的值是单值,那么你可以直接使用 Hashtable table = new Hashtable ();
  • 但是如果文本文件包含多个排序后相同的单词怎么办?这就是为什么我想要一个 LinkedList 作为值
  • 仅供参考,我们通常使用HashMap 而不是Hashtable,除非这是一个多线程程序。见docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html

标签: java hash hashtable


【解决方案1】:

这是我的解决方案。解决方案是遍历单词,使用Array.sort() 对字符进行排序。检查 Hashtable 是否填充了排序的单词,然后从那里创建 LinkedList 并将元素添加或添加到已创建的 LinkedList。不知道为什么选择LinkedList 作为数据结构。

Hashtable <String, LinkedList<String>> table = new Hashtable <String, LinkedList<String>>();

for(String s : new String[]{"cat","dog","mouse", "cat"})
{
     char[] chars = s.toCharArray();
     Arrays.sort(chars);
     String sorted = new String(chars);

     if(table.containsKey(sorted))
     {
         LinkedList<String> list = table.get(sorted);
         list.add(s);
     }
     else
     {
         LinkedList<String> list = new LinkedList<String>();
         list.add(s);
         table.put(sorted, list);
     }
}

这将产生以下哈希表。

{act=[cat, cat], emosu=[mouse], dgo=[dog]}

将此问题用于对字符进行排序。

Sort a single String in Java

【讨论】:

  • 这是一个编程错误,因为“现在我只是对如何从本质上添加到我的 LinkedList 感到困惑”。我认为这个问题还没有那么复杂。
  • 好的,感谢您修复它。请注意,first table.put(sorted,list) 并没有完成任何事情。哈希映射中的值已经是对list 的引用,而您只是将其替换为自身。 第二个当然是必要的。
  • 我知道,但有时为了便于阅读,添加参考会更清楚。
  • 正是我所做的!太感谢了!定义。清除一切!
【解决方案2】:

你可以这样做:

if(!table.containsKey(sorted)) {
     table.put(new LinkedList<String>())
}
table.get(sorted).add(...)

【讨论】:

    【解决方案3】:

    这段代码的问题:

     LinkedList <String> temp = table.get(sortedWord) //if null, then nothing in list
     if(temp==null) 
         table.put(sortedWord,temp.add(originalWord));
    

    如果tempnull,这意味着您没有LinkedList,但您的声明试图将originalWord 添加到不存在的LinkedList。如果tempnull,那么temp.add 肯定会得到NullPointerException

    如果您确实拥有LinkedList(并且在这种情况下您不需要另一个table.put),则使用temp.add 是您想要做的。如果您没有,则必须使用一个元素创建一个新的LinkedList。这是一种方法:

    if (temp == null) {
        LinkedList<String> newList = new LinkedList<>(Arrays.asList(originalword));
        table.put(sortedWord, newList);
    } else {
        // you have a LinkedList, add the word to it
    

    Arrays.asList 似乎是创建只有一个元素的列表的最简单方法。不过,它不会是 LinkedList,因此您需要一个额外的构造函数调用来创建 LinkedList。)

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 2019-04-12
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多