我有一个以枚举类型为键、以 Double 为值的 Map。我想根据 Double 值对此进行排序。所以我得到了入口集,想用
Collections.sort()
和比较器。我有以下比较器代码
class ScoreComparator<Map.Entry<K, V>> implements Comparator<Map.Entry<K, V>> {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
}
我收到以下错误消息
Syntax error on token ".", extends expected (line 1)
.The type parameter Map is hiding the type Map<K,V> (line 1)
.我无法解决这个问题。非常感谢任何帮助。提前致谢。
你可能想要这个:
// Declare K and V as generic type parameters to ScoreComparator
class ScoreComparator<K, V extends Comparable<V>>
// Let your class implement Comparator<T>, binding Map.Entry<K, V> to T
implements Comparator<Map.Entry<K, V>> {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
// Call compareTo() on V, which is known to be a Comparable<V>
return o1.getValue().compareTo(o2.getValue());
}
}
ScoreComparator
有两个通用类型参数 K
和 V
。 Map.Entry<K, V>
不是有效的泛型类型定义,但您可以很好地使用它来绑定到 Comparator<T>
的 T
类型。
请注意,
V
必须扩展 Comparable<V>
,以便能够在 compareTo()
上调用 o1.getValue()
。
您现在可以像这样使用上面的
ScoreComparator
:
new ScoreComparator<String, String>();
new ScoreComparator<Long, Integer>();
// etc...
注意,根据您当前的实现,您可能甚至不需要
K
参数。替代方案:
class ScoreComparator<V extends Comparable<V>>
implements Comparator<Map.Entry<?, V>> {
public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) {
// Call compareTo() on V, which is known to be a Comparable<V>
return o1.getValue().compareTo(o2.getValue());
}
}
您不必定义自己的比较器类。您可以使用
Comparator.comparing
方法创建比较器,如下所示:
import java.util.*;
public class App {
public static void main(String[] args) {
Map<String, Double> myMap = new HashMap<>();
myMap.put("a", 5.);
myMap.put("b", 3.);
myMap.put("c", 11.);
// Or the following for Java 9 or higher
// Map<String, Double> myMap = Map.of("a", 5., "b", 3., "c", 11.);
List<Map.Entry<String, Double>> entryList = new ArrayList<>(myMap.entrySet());
System.out.println("Sorted by values:");
Collections.sort(entryList, Comparator.comparing(Map.Entry::getValue));
entryList.stream().forEach(System.out::println);
System.out.println("\nSorted by keys:");
Collections.sort(entryList, Comparator.comparing(Map.Entry::getKey));
entryList.stream().forEach(System.out::println);
}
}
输出:
Sorted by values:
b=3.0
a=5.0
c=11.0
Sorted by keys:
a=5.0
b=3.0
c=11.0