2017-08-16 81 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); 
相關問題