2010-11-29 12 views
0

Map<String,String>には「User1」、「43」などのエントリがあります。今私は最高値の「トップ3」を求めています。Map <String、String>から最大値を3つ取得

Map<String,Integer>の方が簡単ですが、技術的な制限のためにマップを取得できるのは<String,String>です。

<String,String>マップを<String,Int>に変換して並べ替える最も効率的な方法は何ですか?

答えて

0

Map.values()を使用してMapの値を繰り返し、Integer(Integer.getInteger(String s)を使用)をそれぞれ変換し、表示されるトップ3を追跡できます。

または、上の3を追跡する代わりに、LinkedListを作成して各整数を正しい場所に挿入します(Integerを挿入する場所を見つけるまでLinkedListをたどります)。

1

いくつかの方法があります。

  1. は、例えばSortedMapのを作成します。 TreeMapにはカスタムの匿名Comparatorがあり、compare()メソッド呼び出しで取得したキーを元のマップの値と照合して比較を実行します。
  2. addAll()メソッドを使用して、元のすべてのキー/値エントリを設定します。
  3. 値でソートされている地図を見る。
  4. 上記と同様に(どのようにあなたのコンパレータの種類に応じて)グラブヘッド/テール

  1. 上記のようなカスタムのコンパレータとキーのTreeSetの作成...
  2. 移入元のマップのkeySet()を使用します。
  3. キーの先頭/末尾のセットを取得します。
  4. <String, String>から使用できる<String, Integer>に変換するには...
3

を元のマップからそれらのキーと値から新しいマップを作成します。

Map<String, Integer> treemap = new HashMap<String, Integer>(); 
for (Entry<String, String> entry : entries) { 
    treemap.put(entry.getKey(), Integer.parseInt(entry.getValue())); 
} 

しかし、あなたは反復する必要があります再び地図。マップ全体を必要とせず、トップ3だけが必要な場合は、単純にエントリを反復し、上位3つを比較することができます。

また、トップ要素とデータ全体の両方が必要な場合は、キーと値を逆にして、ComparatorTreeMap<Integer, String>を使用することができます。

1

あなただけのリストに値を入れて、それを並べ替えることができます:

ArrayList<Integer> highest = new ArrayList<Integer>(); 
for (String value : map.values()) { 
    highest.add(Integer.parseInt(value)); 
} 
Collections.sort(highest); 
for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){ 
    System.out.println(highest.get(i)); 
} 

マップが非常に大きい場合、それを反復処理する方が良いとだけ全体のリストをソートすることなく、3つの最高値を選択するかもしれません。

関連する問題