14

私は Java に非常に慣れていないので、Python プログラムの 1 つを Java に変換するという演習に取り組んでいます。

私は動作を複製しようとしている問題に遭遇しました.Pythonから、以下は値ではなく(値で)ソートされたキーのみを返します:

popular_numbers = sorted(number_dict, key = number_dict.get, reverse = True)

Java について少し調べてみましたが、自分のような n00b や同等の方法の簡単なサンプルをまだ見つけていません。並べ替えに Guava を使用する例を見つけましたが、並べ替えはキーで並べ替えられた HashMap を返すようです。

上記に加えて、Java では見つけられなかった Python の優れた点の 1 つは、ソートされた値のサブセットを簡単に返すことができることです。Python では、次のことを簡単に実行できます。

print "Top 10 Numbers: %s" % popular_numbers[:10]

この例では、number_dict はキーと値のペアのディクショナリで、キーは数字 1..100 を表し、値は数字 (キー) の出現回数です。

for n in numbers:
 if not n == '':
   number_dict[n] += 1

最終結果は次のようになります。

上位 10 の数字: ['27'、'11'、'5'、'8'、'16'、'25'、'1'、'24'、'32'、'20']

明確にするために、JavaでHashMapを正常に作成し、数値を正常に調べて、キーと値のペアの値を増やしました。私は今、ソートで立ち往生しており、値に基づいて上位 10 個の数字 (キー) を返します。

4

9 に答える 9

10
  1. マップentrySet()を に入れListます。
  2. 値に基づいて s を並べ替える と を使用Collections.sortして、このリストを並べ替えます。ComparatorEntry
  3. subList(int, int)のメソッドを使用してList、上位 10 個の要素を含む新しいリストを取得します。

はい、Pythonよりもはるかに冗長になります:)

于 2013-06-13T19:13:53.590 に答える
0

Guava Multisetはユースケースに最適で、HashMap を適切に置き換えることができます。各要素の出現回数をカウントするコレクションです。

Multisets にはメソッドcopyHighestCountFirstがあり、カウント順に並べ替えられた不変の Multiset を返します。

今いくつかのコード:

Multiset<Integer> counter = HashMultiset.create();
//add Integers 
ImmutableMultiset<Integer> sortedCount = Multisets.copyHighestCountFirst(counter);
//iterate through sortedCount as needed
于 2013-06-13T20:47:30.727 に答える
0

マップが次のように定義されており、値に基づいて並べ替えたいと仮定します。

HashMap<Integer, Integer> map= new HashMap<Integer, Integer>();
//add values
Collection<Integer> values= map.values();
ArrayList<Integer> list= new ArrayList<Integer>(values);
Collections.sort(list);

ここで、リストの最初の上位 10 要素を出力します。

for (int i=0; i<10; i++) {
    System.out.println(list.get(i));
}

はまったくソートされないため、マップ内の値は実際にはHashMapソートされません (キーの hashCode に基づいてバケットに値を格納します)。このコードは、マップ内の最小の 10 個の要素を表示しているだけです。

キーと値のペアを失わずに並べ替えを編集します。

//sorted tree map
TreeMap<Integer, Integer> tree= new TreeMap<>();

//iterate over a map
Iteartor<Integer> it= map.keySet().iterator();
while (it.hasNext()) {
    Integer key= it.next();
    tree.put(map.get(key), key);
}

これTreeMapで、ソートされ、元のマップからキーと値のペアが逆になったツリーができたので、情報が失われることはありません。

于 2013-06-13T19:11:43.377 に答える
0

HashMaps は Java では順序付けされていないため、すべてのキーを力ずくで検索する以外に順序付けを行う良い方法はありません。使用してみてくださいTreeMap: http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

于 2013-06-13T19:12:02.937 に答える
0

ランキング順を維持し、マップ サイズのサイズよりもはるかに小さいトップ カウントを効率的に返すには、次のようにします。

map.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            .limit(count)
            .collect(toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (e1, e2) -> e1,
                    LinkedHashMap::new))
于 2021-01-07T01:36:23.850 に答える