java beginner:密钥如何在哈希映射中排序?

时间:2013-08-29 06:54:50

标签: java sorting hashmap key-value

我是java的新手,正在学习哈希映射的概念。

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

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
**********************

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

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中完成排序?请帮忙!!

提前致谢。

6 个答案:

答案 0 :(得分:2)

java beginner : How key gets sorted in hashmaps?

取自here的答案,这也是你问题的答案

使用有序的TreeMap:

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

它会自动按键排序。我认为自然的字符串排序在你的情况下会很好。

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

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

答案 1 :(得分:2)

  

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

     

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

     

java.util.LinkedHashMap使用insert-order。

     

这个实现与HashMap的不同之处在于它维护着一个运行所有条目的双向链表。这有联系   list定义迭代排序,通常是顺序   哪些键被插入到地图中(插入顺序)。

     

java.util.TreeMap,一个SortedMap,使用自然或自定义排序   钥匙。

     

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

答案 2 :(得分: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的快照

Data in Hashmap after insertion of key value

HashMap在内部使用Entry of Entry Map,键生成的哈希码被输入到哈希函数中,该函数使得该键按照您查看的顺序插入到数组中。 您正在使用迭代器来迭代hashmap,看看上面集合的迭代器的快照,因为迭代器按以下顺序查看集合,它似乎只是键被排序但实际上没有。 Iterator snap for iterating over the above hashmap (注意:迭代器不保证迭代按照集合中存在的元素的顺序) 所以它只是相似而不是hashmap的实际行为。对于排序键,此行为由TreeMap或任何实现接口SortedMap的集合以及可比较时的键提供。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试TreeMap,

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

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

答案 5 :(得分:0)

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