8

から上位 10 個の値を取得する方法を見つけようとしていHashMapます。私は最初に を使用して、値で並べ替えてから最初の 10 個の値を取得しようとしていましたが、キーTreeMapで並べ替えるため、それはオプションではないようです。TreeMap

どのキーが最も高い値を持っているかを知りたいのですK, Vが、マップのString, Integer.

4

6 に答える 6

4

おそらくComparable、ハッシュマップに格納されている値オブジェクトへのインターフェイスを実装する必要があります。次に、すべての値の配列リストを作成できます。

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

よろしく

于 2013-03-15T15:52:54.933 に答える
3
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
    }
}
于 2013-03-15T15:57:39.523 に答える
0

残念ながら、マップ全体を反復処理する必要があります。ヒープは、この本で説明されているように、上位 K 個の要素を見つけるために一般的に使用されるデータ構造です。

于 2013-03-15T15:48:28.030 に答える
0

マップの上位 10 個の値を取得しようとしている場合 (値が数値であるか、少なくとも Comparable を実装していると仮定)、これを試してください。

List list = new ArrayList(hashMap.values());
Collections.sort(list);
for(int i=0; i<10; i++) {
   // Deal with your value
}
于 2013-03-15T15:48:56.593 に答える
0

Let's assume you have a Map, but this example can work for any type of

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)); 
}
于 2013-03-15T15:56:02.337 に答える