1

私は Java にあまり詳しくなく、これを C# から Java に変換する方法が少しわかりません。

Dictionary<string, int> myDictionary = GetDictionary();
int N = 10;

myDictionary
         .OrderByDescending(dictionaryEntry => dictionaryEntry.Value)
         .Take(N)
         .Select(dictionaryEntry => dictionaryEntry.Key)
         .ToList();

今、私は辞書自体がソートされていないことを知っています。それは単に新しい IEnumberable であり、それで問題ありません。

ありがとう!

4

3 に答える 3

1

私はC#の男ではありません.C#の男ではありません.リストに 10 個の要素。

値が異なることがわかっている場合、それは些細なことです。キーと値を交換して SortedMap に変換するだけです。したがって、値は明確ではないと仮定しています。つまり、同じ数値が複数回表示される可能性があります。

その場合、それは些細なことではなく、C# の例ほど単純ではありません。私が最初に考えたのは、セット内の各要素がキーと値が交換されるマップの Map.Entry である、カスタム コンパレータを使用して並べ替えられたセットを作成することでした。

これには、実際には Java でかなりのコードが必要になります。Heres 1 つの試み:

// Create a SortedSet of the reversed entry set, with a custom comparator for sorting
SortedSet<Map.Entry<Integer, String>> sortedSet = new TreeSet<Map.Entry<Integer, String>>(
        new Comparator<Map.Entry<Integer, String>>() {
    public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
        // sort by key, then by value --> in descending order
        int keyCompareResult = -o1.getKey().compareTo(o2.getKey()); // negate --> descending
        int valueCompareResult = o1.getValue().compareTo(o2.getValue());
        return keyCompareResult == 0 ? valueCompareResult : -keyCompareResult;
    }
});

// Add all entries of the map to the sorted set
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    Map.Entry<Integer, String> reversedEntry = new AbstractMap.SimpleEntry<Integer, String>(entry.getValue(), entry.getKey());
    sortedSet.add(reversedEntry);
}

// Convert the 10 first elements to the resulting list
int N = 10;
List<String> result = new ArrayList<String>(N);
Iterator<Map.Entry<Integer,String>> iterator = sortedSet.iterator();
while (iterator.hasNext() && result.size() < N) {
    Map.Entry<Integer, String> entry = iterator.next();
    result.add(entry.getValue());
}
于 2013-11-08T03:24:09.930 に答える
0

シュタイナーが提案したのとほぼ同じことを思いつきました。よりLINQ-y/機能的な方法を知っている場合は、回答も追加してください!

//Convert to List of Map.Entry
ArrayList<Map.Entry<String,Integer>> myArrayList = ArrayList<Map.Entry<String,Integer>>(myHashMap.entrySet());

//Natural order is ascending, so we reverse the comparator to get it Descending.
Collections.sort(myArrayList , Collections.reverseOrder(new EntryComparator()));

//Create list and add Keys

List<String> topNStrings =  new ArrayList<String>();

for (int i = 0; i < N && i < myArrayList.size(); i++)
{
  topNStrings.add(myArrayList.get(i).getKey());
}

別の小さなコンパレータクラスがありました

private class EntryComparator implements Comparator<Map.Entry<String,Integer>>
    {
    @Override
    public int compare(Map.Entry<String,Integer> x, Map.Entry<String,Integer> y)
    {
        return compare(x.getValue(), y.getValue());
    }

    private int compare(Integer a, Integer b)
    {
        return a < b ? -1
                : a > b ? 1
                : 0;
    }
}
于 2013-11-08T04:53:14.383 に答える
-1

によって定義された何らかの方法で取得した任意の HashMap から始めましょうHashMap<String, Integer> map

値を並べ替えてから、最初のを取得しNます。

int N = 10;

List<Integer> values = new ArrayList<Integer>( map.values() );
Collections.sort(values);
List<Integer> N_values = values.subList(0, N);
于 2013-11-08T03:00:23.660 に答える