Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Hashmap值排序为compareTo方法_Java_Collections_Hashmap - Fatal编程技术网

Java 将Hashmap值排序为compareTo方法

Java 将Hashmap值排序为compareTo方法,java,collections,hashmap,Java,Collections,Hashmap,我正在编写以下代码来对哈希映射值进行排序: private static HashMap sortByValues(HashMap map) { List list = new LinkedList(map.entrySet()); Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return (((Map.Entry

我正在编写以下代码来对哈希映射值进行排序:

private static HashMap sortByValues(HashMap map) { 
    List list = new LinkedList(map.entrySet());
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
            return (((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
        }
    });
}
但是,当我执行此操作时,它会抛出一个错误,说明找不到符号比较。但是lang包中的String类中的方法不是吗

另外,当我通过添加类似的类型转换来替换它时,它运行良好

private static HashMap sortByValues(HashMap map) { 
    List list = new LinkedList(map.entrySet());
    Collections.sort(list, new Comparator() {
        public int compare(Object o1, Object o2) {
             return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue());
        }
    });
}

有人能帮忙吗,我是收藏品的初学者。

你可以通过以下方法来完成

private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) {

        // 1. Convert Map to List of Map
        List<Map.Entry<String, Integer>> list =
                new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet());

        // 2. Sort list with Collections.sort(), provide a custom Comparator
        //    Try switch the o1 o2 position for a different order
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Map.Entry<String, Integer> o1,
                               Map.Entry<String, Integer> o2) {
                return (o1.getValue()).compareTo(o2.getValue());
            }
        });

        // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap
        Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
        for (Map.Entry<String, Integer> entry : list) {
            sortedMap.put(entry.getKey(), entry.getValue());
        }




        return sortedMap;
    }
私有静态映射sortByValue(映射非排序映射){
//1.将地图转换为地图列表
列表=
新建LinkedList(unsortMap.entrySet());
//2.使用Collections.Sort()对列表进行排序,提供自定义比较器
//尝试切换o1 o2位置以获得不同的顺序
Collections.sort(list,newcomparator(){
公共整数比较(Map.Entry o1,
地图入口(o2){
return(o1.getValue()).compareTo(o2.getValue());
}
});
//3.循环已排序的列表并将其放入新的插入顺序映射LinkedHashMap
Map sortedMap=new LinkedHashMap();
用于(映射条目:列表){
sortedMap.put(entry.getKey(),entry.getValue());
}
返回分拣的DMAP;
}

@ghostrider-您已经从HashMap中删除了泛型,因此键和值都是对象类型。地图内部内容为可比类型,但参考为
条目
而非
条目
。看看下面的例子

Object obj = new Integer(5);
int i = obj.intValue();  // Error
int i = ((Integer)obj).intValue(); // Success

这里
inti=obj.intValue()失败,但
inti=((整数)obj).intValue()获得成功,因为我是显式类型转换的,因为引用是对象类型。

所有Java的集合类和接口都是泛型,这意味着它们要与类型参数一起使用。出于历史原因,可以在不使用类型参数的情况下使用它们,这就是您在这里所做的。然而,这样做是个坏主意,因为

  • 您牺牲了编译器提供的大量类型安全性
  • 您最终将对象强制转换为您需要的任何类型,这很容易出错,并且这些错误通常只在运行时才会显示出来
在编译时查找错误比在运行时查找错误要好。编译器是你的朋友-它会给你消息来帮助你发现错误

现在在这个特殊的例子中,您似乎正在从地图中构建一个排序的值列表。但只有当地图中的值属于某种可以排序的类型时,这样做才有意义。没有对对象进行排序的通用方法,因此为了使其有意义,您需要将参数限制为一个可以对其值进行排序的映射,或者换句话说,可以将其与相同类型的其他对象进行比较

告诉您可以将一个对象与另一个对象进行比较的通用接口是
可比
。因此,如果您有一个类型
V
,那么写入
V扩展了Comparable
意味着可以使用
compareTo
方法将一个类型为
V
的对象与其他类型为
V
的对象进行比较。这是您希望映射中的值类型遵守的条件。地图中的关键点类型不需要任何此类条件

因此,您可以将方法编写为泛型,这意味着它的签名将在
字符内列出一些类型参数,这些类型参数可能带有一些条件。在您的例子中,您会给您的方法一个这样的签名,假设它将返回一个
列表

private static <K, V extends Comparable<V>> List<V> sortAndListValues(Map<K,V> map)
请注意,通过在适当的位置使用类型参数
K
V
,无需进行任何类型的铸造。如果您试图以不适合其类型的方式使用映射中的任何对象,编译器也会发出警告


当然,还有一些较短的编写方法,使用Java8附带的“函数式风格”。但这完全是另一篇文章的主题。

第1步-了解泛型。如果你不知道泛型,你将无法理解这里发布的任何正确答案。可能是重复的,我正在尝试按值排序keys@DawoodibnKareem字符串类中也存在compareTo方法。在这里,我按字符串值排序。那么,没有可比类型转换的compareTo不是很好吗?不,不太好。编译器不能保证HashMap中的内容是字符串。因此,即使您的代码在运行时可能很好,编译器也会保护您,使您不会尝试比较无法比较的内容。您应该使用泛型来告诉编译器HashMap中的所有内容都实现了Compariable。如果我有时间的话,我可能会稍后再写一个答案(我不太喜欢rab的答案),但事实上,你要做的最好的事情就是学习如何使用泛型,正如我之前所说的。谢谢你的答案。我想问题中的方法似乎更简洁,有可能解释我的方法有什么问题吗?请你检查一下!这看起来不错。我建议使用泛型来实现逻辑。你不觉得上面的字体看起来更整洁吗?你能告诉我有什么我缺少这种偏见吗?泛型总是一个很好的特性,所以我会鼓励你尽可能使用泛型。它提供了
编译时安全性
无需执行显式类型转换
“整洁”是主观的。您所缺少的是,通过不使用泛型,可以防止编译器指出可能表现为运行时错误的问题。
private static <K, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map)
private static <K, V extends Comparable<V>> List<V> sortAndListValues(Map<K,V> map) {
    List<V> toReturn = new LinkedList<>(map.values());
    Collections.sort(toReturn, new Comparator<V>() {
        public int compare(V first, V second) {
             return first.compareTo(second);
        }
    });

    return toReturn;
}