我不是 C# 人,我从来没有使用过它,但如果我应该猜测一下,您似乎正在按其值按降序对地图进行排序,检索前 10 个元素,然后转换那些的键10 个元素到一个列表中。
如果已知这些值是不同的,那么这很简单——您只需转换为带有交换键和值的 SortedMap。所以我假设这些值不是不同的,即相同的数字可能会出现多次。
在那种情况下,它并不像您的 C# 示例那么简单,而且绝对不像您的 C# 示例那么简单。我的第一个想法是使用自定义比较器创建一个排序集,其中集合中的每个元素都是地图中的 Map.Entry,其中键和值被交换。
这实际上需要相当多的 Java 代码。这是一种尝试:
// 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());
}