2017-08-16 39 views
0

我目前正在写这将使用Hashtable来计数文件中的单词一个单词计数程序,我想创建程序内的链接列表进行排序的话降序排列的发生。如何将元素添加到HashTable的LinkedList中并对它们进行排序?

我知道如何将元素添加到链接列表,但我不知道如何将元素从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()); 
    } 
    } 
} 
+0

这将更有意义使用的'ArrayList',因为你已经知道有多少它ems有,你可以用'Collections.sort()'来排序。 – EJP

回答

0

对于一个哈希表,你可以得到它包含的值的集合,read more about it here

一旦你获得该集合,排序它如何想;-)

然后通过条目集哈希表的迭代。 (Here's an example, just ignore the deleting entry stuff)然后将每个Map.Entry对象的值与集合中的第一个元素(从上面)进行比较。如果匹配,则将该值添加到要返回的列表中。这假设没有重复的字数,如果有欺骗,你将不得不删除哈希表副本的元素,使其工作

(如果这增加牵引力,我相信有人会张贴lambda方式做它)

0

下面是高电平步骤 1)定义具有属性字LinkNode和计数和自参照LinkNode如接下来 2)定义,这将到LinkNode 3)的头部返回参考在该方法的方法遍历哈希表和下面的活动 一)如果链表为空 创建字LinkNode和计数值进行分配,并以此为链表的头二)其他 你需要找到要插入的新节点的位置(遍历节点,并与名单上的节点比较次数来决定根据您的订单上) 3)你可以返回构建头节点

0

一个可能的解决方案是使用拉姆达,在这个例子中,没有必要从哈希转化为链表,只使用哈希进行排序,并列出前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); 
相关问题