2013-03-15 5 views
6

HashMapから上位10個の値を取得する方法を調べようとしています。私は最初にTreeMapを使用して値でソートしてから最初の10個の値を取っていましたが、これはオプションではないようです。TreeMapはキーでソートされています。ハッシュマップで上位10個の値を取得

マップのK, Vは、どちらのキーが最大値であるかをまだ知りたいのですが、String, Integerです。

+4

あなたがトップ10に何を意味するのですか?何に基づいて? – jsedano

+0

比較している要素の種類を示すコードを投稿してください。 –

+0

TreeMapはソートを行うことができます。しかし、私たちにあなたがそれを整理しようとしていることを知るために、私たちに言わなければなりません! – Kevin

答えて

0

マップ全体を反復処理する必要があります。 Heapは、this bookで説明されているように、上位K要素を見つけるためによく使用されるデータ構造です。

0

あなたはこの試行し(値が数値であるか、少なくともComparableを実装すると仮定して)マップの10個の最高値を取得しようとしている場合:たぶん、あなたはあなたの値にComparableインタフェースを実装する必要があります

List list = new ArrayList(hashMap.values()); 
Collections.sort(list); 
for(int i=0; i<10; i++) { 
    // Deal with your value 
} 
+0

これは、値型 'Foo'が' Comparable 'あなたは生のタイプのリストを使用しません。 – jlordo

+0

OPが彼の質問で指定した場合、私は生のタイプを入れているだろう:) – aymeric

2

をハッシュマップに格納されているオブジェクト そして、あなたはすべての値の配列リストを作成することができます

List<YourValueType> l = new ArrayList<YourValueType>(hashmap.values()); 
Collection.sort(l); 
l = l.subList(0,10); 

よろしく

+0

かなり良い解決策。私はちょうど同様のものが必要でした。あなたは値を提供しているだけなので、キーも必要でした。私はわずかな変更を加え、エントリセットを使用するためにコンパレータを追加しました。比較器は、エントリ値を降順で比較しなければならない。 > results =新しいArrayList <>(hashmap.entrySet()); Collections.sort(結果、新しいEntryComparator()); 結果= results.subList(0、10); – sebadagostino

+1

コメントとして悪く見えるので別の回答として追加しています – sebadagostino

0

のは、あなたが地図を持っていると仮定しましょう、しかし、この例では、

Map<String, String> m = yourMethodToGetYourMap(); 
List<String> c = new ArrayList<String>(m.values()); 
Collections.sort(c); 
for(int i=0 ; i< 10; ++i) { 
    System.out.println(i + " rank is " + c.get(i)); 
} 
2
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Testing { 

    public static void main(String[] args) { 

     HashMap<String,Double> map = new HashMap<String,Double>(); 
     ValueComparator bvc = new ValueComparator(map); 
     TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc); 

     map.put("A",99.5); 
     map.put("B",67.4); 
     map.put("C",67.4); 
     map.put("D",67.3); 

     System.out.println("unsorted map: "+map); 

     sorted_map.putAll(map); 

     System.out.println("results: "+sorted_map); 
    } 
} 

class ValueComparator implements Comparator<String> { 

    Map<String, Double> base; 
    public ValueComparator(Map<String, Double> base) { 
     this.base = base; 
    } 

    // Note: this comparator imposes orderings that are inconsistent with equals.  
    public int compare(String a, String b) { 
     if (base.get(a) >= base.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } // returning 0 would merge keys 
    } 
} 
+0

ああ、私はそれを行うかもしれないと思う、それは今、感謝を与えるつもり! – Tohmas

+0

@Biswajit、このコードの複雑さを教えてください。あなたのコードは完璧に動作していて、このコードの複雑さを計算したいと思っています.... – Rushi

+0

@Biswajit、コードは素晴らしいですが、TreeMapのサイズを常に10にするにはどうすればいいですか?あなたはTOP TENだけにしたいのですから? ツリーマップにキーと値のペアを挿入するたびに、現在のサイズが10より大きいかどうかを確認する必要があります。存在する場合は、TreeMapで最小のキーと値のペアを削除する必要があります。コードのこの最後の部分はどのようにして行いますか?私はここで人々が私の質問に答えるとは思わなかったので、私はこの記事を参考にして新しい質問をしました[Here](http://stackoverflow.com/questions/37244198/how-to-maintain-a-java-treemap-sizeキー値ペアの追加中定数) –

0

のいずれかのタイプのために働くことができますが私はこの回答に基づいていますsk2212

まずは降順のコンパレータを実装する必要があります。

class EntryComparator implements Comparator<Entry<String,Integer>> { 

    /** 
    * Implements descending order. 
    */ 
    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
     if (o1.getValue() < o2.getValue()) { 
      return 1; 
     } else if (o1.getValue() > o2.getValue()) { 
      return -1; 
     } 
     return 0; 
    } 

} 

次に、あなたがそのような属性「ハッシュマップ」のため、この1の方法でそれを使用することができます。

public List<Entry<String,Integer>> getTopKeysWithOccurences(int top) { 
    List<Entry<String,Integer>> results = new ArrayList<>(hashmap.entrySet()); 
    Collections.sort(results, new EntryComparator()); 
    return results.subList(0, top); 
} 
関連する問題