2016-04-18 8 views
1

これを行う方法を理解するのに少し問題があります。私は、単語がStringであり、.txt文書で言われた回数がIntegerであるMap<String, Integer>を使って、Javaで単語カウンタを構築しています。これはすごくうまくいっていますが、トップ5の結果が何であるかを底に表示する部分を開発しようとしています--->トップ5 map.values()は何ですか?マップの値からキーを見つける

私が遭遇した問題は、値を見つけた後で、文字列を取得できないことです。

私にはどんな提案も役に立ちます。

+0

'地図<文字列、整数>は'あなたのコードは唯一の値は最初の5つの値のためにあるものを伝えますWORDCOUNT – kwolff7

答えて

2

キーと値のペアを取得するには、Map.Entry<String, Integer>を使用する必要があります。

values()メソッドは値のみを返しますが、keySet()メソッドはキーのみを返します。

まず、値に基づいてマップをソートして、上位5つの結果を取得する必要があります。 直接的なアプローチはComparatorを使用します。詳細については、hereの回答を参照してください。

次に、map.getEntrySet()の最初の5つのエントリを取得します。これにはIteratorを使用する方が簡単です。

UPDATE:

Set<Entry<String, Integer>> set = wordCount.entrySet(); 
    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set); 
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { 
     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return o2.getValue().compareTo(o1.getValue()); 
     } 
    }); 

    int topResults = 5; 
    Iterator<Entry<String, Integer>> iter = list.iterator(); //refer the sorted collection 
    while (iter.hasNext() && topResults > 0) { 
     Map.Entry<String, Integer> entry = iter.next(); 
     System.out.println(entry.getKey() + "->" + entry.getValue()); 
     topResults --; 
    } 
+0

と命名されています。 – kwolff7

+0

このコードは、リンクされた回答に示されているように、Comparatorに基づく手法を使用してCollections.sortを実行した後に使用されます。 – SarathChandra

+0

私は私が試したものの上に置いた、それはまだ動作しませんでした、それは間違っていましたか? – kwolff7

0

a)のマップを反復、あなたはアクセスの両方のキーと値を持っている。この方法:

b)は、例えば、逆引き参照のための第2のマップを構築マップ - キーが重複している可能性があるので、これは良い考えではないことにご注意ください。

c)bidimapの使用を検討してください。これは、キーと値の両方でクエリできるマップです。

0

私はあなたがComparatorをオーバーライドし、それに基づいて、地図のコンストラクタを構築することをお勧めします。 コードは以下を示している:

class ValueComparator implements Comparator { 
    Map map; 

    public ValueComparator(Map map) { 
     this.map = map; 
    } 

    public int compare(Object keyA, Object keyB) { 
     Comparable valueA = (Comparable) map.get(keyA); 
     Comparable valueB = (Comparable) map.get(keyB); 
     return valueB.compareTo(valueA); 
    } 
} 

public class YourClass{ 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 
     map.put("a", 10); 
     map.put("b", 30); 
     map.put("c", 50); 
     map.put("d", 40); 
     map.put("e", 20); 
     System.out.println(map); 

     Map sortedMap = sortByValue(map); 
     System.out.println(sortedMap); 
    } 

    public static Map sortByValue(Map unsortedMap) { 
     Map sortedMap = new TreeMap(new ValueComparator(unsortedMap)); 
     sortedMap.putAll(unsortedMap); 
     return sortedMap; 
    } 

} 
+0

[* "生の型とは何ですか?それはなぜ使用しないのですか" *](http://stackoverflow.com/q/2770321/2891664)あなたの 'ValueComparator'は重複した値を持つエントリも削除します。 – Radiodef

関連する問題