Map.Entry 的比较器<K,V>

问题描述 投票:0回答:2

我有一个以枚举类型为键、以 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());
    }   
}

我收到以下错误消息

  1. Syntax error on token ".", extends expected    (line 1)
    .
  2. The type parameter Map is hiding the type Map<K,V> (line 1)
    .
  3. 因为上面两个错误,K和V无法解析为一个类型(第3,4行)。

我无法解决这个问题。非常感谢任何帮助。提前致谢。

java dictionary comparator
2个回答
12
投票

你可能想要这个:

// 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());
    }   
}

1
投票

您不必定义自己的比较器类。您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.