如何从HashTable向LinkedList添加元素并对它们进行排序?

时间:2017-08-16 22:13:27

标签: java sorting linked-list hashtable

我目前正在编写一个单词计数器程序,它将使用Hashtable来计算文件中的单词,我想在程序中创建一个链表来对单词进行排序。按降序出现。

我知道如何将元素添加到链接列表,但我不知道如何将Hashtable中的元素添加到链接列表中,并按降序对值进行排序。你可以帮忙吗?

这是我到目前为止的代码:

import java.io.FileReader;
import java.util.*;
import java.util.Hashtable;
import java.util.stream.Collectors;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class WordCounter {

  public Hashtable count_words(String contents) {
    Hashtable < String, Integer > count = new Hashtable < String, Integer > ();

    Set < String > key = count.keySet();

    StringTokenizer w = new StringTokenizer(contents);

    while (w.hasMoreTokens()) {
      String word = w.nextToken();

      word = word.toLowerCase();
      word = word.replaceAll("[-+.^:(\"),']", "");

      if (count.containsKey(word)) {
        count.put(word, count.get(word) + 1);
      } else {
        count.put(word, 1);
      }
    }
    return count;
  }


  public LinkedList top20(Hashtable count) {
    ///I don't know how to add elements from hashtable to linkedlist
    return new LinkedList();
  }


  public static void main(String args[]) {
    try {
      String contents = "";
      Scanner in = new Scanner(new FileReader("src/ADayInTheLife.txt"));
      while ( in .hasNextLine()) {
        contents += in .nextLine() + "\n";
      }
      WordCounter wc = new WordCounter();
      Hashtable count = wc.count_words(contents);

      System.out.println(count);

    } catch (Exception e) {
      System.err.println("Error " + e.getMessage());
    }
  }
}

2 个答案:

答案 0 :(得分:0)

以下是高级步骤 1)定义具有属性字和计数的LinkNode以及对LinkNode的自引用作为下一个 2)定义一个方法,它将返回对LinkNode头部的引用 3)在方法迭代哈希表中并执行以下活动    a)如果linkList为空       使用单词和计数值创建一个LinkNode,并将其指定为LinkList的头部    b)其他        您需要找到要插入新节点的位置(遍历节点并将计数与列表上的节点进行比较,以根据您的订单决定) 3)您可以返回构造的头节点

答案 1 :(得分:0)

一种可能的解决方案是使用lambda,在这个例子中,不需要从Hash转换为LinkedList,只需使用Hash按相反顺序对前20个进行排序和列出:

尝试这种方法:

Hashtable<String,Integer> count = wc.count_words(contents);

count.entrySet().stream().sorted(Map.Entry.<String,Integer> comparingByValue().reversed()).limit(20).forEach(System.out::println);