2017-08-16 4 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オブジェクトの値をコレクションの最初の要素(上から)と比較します。一致する場合は、その値のキーを返すリストに追加します。これは二重引用符が存在しない場合、ハッシュテーブルのコピーの要素を削除する必要があります。

(このトラクションが得られれば誰かがラムダのやり方を投稿すると確信していますそれここ)

0

がハイレベル 1ステップである)属性ワードとLinkNodeを定義し、次 2としてLinkNodeへの参照をカウントし、自己)LinkNode 3の頭部への参照が返される方法を定義)の方法においてハッシュテーブルを反復して以下のアクティビティを実行する a)linkListが空の場合 wordおよびcount値を持つLinkNodeを作成し、これをLinkListの先頭に割り当てる b)else 新しいノードを挿入する場所を見つけ出す必要があります(ノードをトラバースし、注文に基づいて決定するためにリストのノードとカウントを比較します) 3)構築されたヘッドノード

を返すことができます

このアプローチを試してみてください:

0

一つの可能​​な解決策は、この例では、単に並べ替えと逆の順序で最初の20を一覧表示するにはハッシュを使用して、LinkedListのにハッシュから変換する必要はありません、ラムダを使用することです

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

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