3

我是java新手,正在学习hashmaps的概念。

我很困惑如何在哈希图中对键进行排序。我知道它基于字符串长度。但我很困惑当字符串长度相同时数据是如何排序的。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExample
{

    public static void main(String args[])
    {
        Map<String,String> map = new HashMap<String,String>(20);//SPECIFYING THE TYPE FOR FINDING HASH CODES.


        //Adding values to the HashMap
        map.put("key value a", "test value 1");
        map.put("key value b", "test value 2");
        map.put("key value c", "test value 3");

        System.out.println("Retrieving values from HashMap");
        retrieveValuesFromListMethod(map);
        System.out.println("**********************");


    }

    /*This method retrieves values from Map
     */
    public static void retrieveValuesFromListMethod(Map map)
    {
        Set keys = map.keySet();
        Iterator itr = keys.iterator();

        String key;
        String value;

        while(itr.hasNext())
        {
            key = (String)itr.next();
            value = (String)map.get(key);
            System.out.println(key + " - "+ value); 
        }
    }
}

这是我的代码。

输出是

Retrieving values from HashMap
key value c- test value 3
key value b- test value 2
key value a- test value 1
**********************

但是如果我给出 aa,ab,ac 而不是 a,b,c 输出是不同的

Retrieving values from HashMap
key value ab - test value 2
key value aa - test value 1
key value ac - test value 3
**********************

对于 1,2,3

Retrieving values from HashMap
key value 1 - test value 1
key value 2 - test value 2
key value 3 - test value 3
**********************

hashmap是怎么排序的?请帮忙!!

提前致谢。

4

6 回答 6

2
java beginner : How key gets sorted in hashmaps?

这里获取答案,这也是您问题的答案

使用排序的 TreeMap:

Map<String, Float> map = new TreeMap<String, Float>(yourMap);

它会自动放置按键排序的条目。我认为自然字符串排序在您的情况下会很好。

请注意,由于查找优化,HashMap 不会保留顺序。

如果要保留数据插入到地图中的顺序,可以使用 LinkedHashMap。

于 2013-08-29T06:59:37.307 回答
2

java.util.HashMap 是无序的;你不能也不应该假设除此之外的任何事情。

此类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

java.util.LinkedHashMap 使用插入顺序。

此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。

java.util.TreeMap 是一个 SortedMap,使用键的自然或自定义排序。

地图根据其键的自然顺序排序,或者由地图创建时提供的比较器排序,具体取决于使用的构造函数。

于 2013-08-29T07:01:36.380 回答
2

在您的情况下,当您使用以下内容时

//Adding values to the HashMap
    map.put("key value a", "test value 1");
    map.put("key value b", "test value 2");
    map.put("key value c", "test value 3");

这是插入键后hashmap的快照

插入键值后Hashmap中的数据

HashMap 内部使用 Array of Entry Map,由键生成的哈希码输入到散列函数,该函数使该键按照您正在查看的顺序插入到数组中。您正在使用迭代器迭代哈希图,请查看上述集合的迭代器快照,因为迭代器按以下顺序查看集合,看起来键已排序但实际上没有。 用于迭代上述哈希图的迭代器快照 (注意:迭代器不保证按照集合中元素出现的顺序进行迭代),因此它只是类似于 hashmap 的实际行为。排序键的这种行为由 TreeMap 或任何实现接口 SortedMap 的集合和可比较的键给出。

希望以上信息对您有所帮助

于 2013-08-29T08:14:09.103 回答
0

Hashmap 未排序。如果您必须保持订单,则必须使用例如LinkedHashMap<K, V>

于 2013-08-29T06:58:39.507 回答
0

试试树图,

Map<String, String> sampleMap = new TreeMap<String, String>(map);

使用TreeMap所有键都按排序顺序

于 2013-08-29T06:59:11.463 回答
0

hashmap 未排序,输出不同,因为 String 的 hashcode 不一样。

于 2013-08-29T07:12:59.973 回答