`
langyu
  • 浏览: 888226 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何实现key, value有序的HashMap?

    博客分类:
  • java
阅读更多
想要写个key, value有序的HashMap,出现性能问题,大家帮忙给个主意吧。

先说下我的设计思路:

LinkedHashMap里面有一个模拟的“双向循环链表”,用来保存entry的插入顺序,我也可以采用这种方法来在插入的时候保存key和value的有序。

这里暂定名为OrderedHashMap,主要代码是从LinkedHashMap抄过来的,它也维护着两个模拟“双向循环链表”:keyHeader和valueHeader,保持key或value由小到大的顺序。当有个元素put进来后,除把它存在散列桶中外,还要在keyHeader按key的大小插入,也要在valueHeader上按value的顺序插入。

想要输出的话,可以从这两个“头指针”向前或向后来迭代得到key或value有序的entry。
(可以实现key和value,正序逆序的输出,只对数值型比较,如果不是数值型的话,如HashMap般正常处理)
下面是测试结果:

Value逆序输出
 OrderHashMap<Object, Object> map = new OrderHashMap<Object, Object>();
        map.put(8, 1);
        map.put(9, "value");
        map.put(5, 6);
        map.put("key", 9);
        
        Iterator<Map.Entry<Object, Object>> it = map.valueDescendIterator();
        while (it.hasNext()) {
            Map.Entry<Object, Object> key = it.next();
            System.out.println(key.getKey() + "   " + key.getValue());
        }


得到结果
key   9
5   6
8   1


Key逆序输出
OrderHashMap<Object, Object> map = new OrderHashMap<Object, Object>();
        map.put(8, 1);
        map.put(9, "value");
        map.put(5, 6);
        map.put("key", 9);
        
        Iterator<Map.Entry<Object, Object>> it = map.keyDescendIterator();
        while (it.hasNext()) {
            Map.Entry<Object, Object> key = it.next();
            System.out.println(key.getKey() + "   " + key.getValue());
        }

得到结果
9   value
8   1
5   6




现在存在的问题:

1.HashMap的key, value都是object,而我现在只想比较数值类型的key或value的对象。对于所有数值型,怎么做个通用的比较方法呢?(我先把它们转成Number类,再强制转成double类型进行比较,总觉的这种方法很山寨)。


2.对象多的时候,插入很慢的。它要从链表头一个接一个的比较对象,速度奇慢无比,怎么能优化下呢?(网上找“查找有序链表”时,都是那个key等于key或value,而我现在想要的不是“等于”而是“接近”,也就是如何生成一个有序链表)
分享到:
评论
28 楼 pricecome 2009-05-31  
明白了,要有序把key设为1,2,3...不就有序了
呵呵


http://pricecome.com

27 楼 langyu 2009-05-31  
keyboard2000 写道
有序有意义么,既然用hash
既hash又有序不觉得矛盾?


仔细想想真的是有点累赘的
hash的话,只为存储
再加上有序,在处理上多了很多步骤
代码本身看起来就很繁琐的

谢谢了,让我想明白很多事情
26 楼 keyboard2000 2009-05-31  
有序有意义么,既然用hash
既hash又有序不觉得矛盾?
25 楼 kumomori 2009-05-28  
读过Java源代码的都知道,Java Collection中的排序是用Black-Red树实现的,基本上是一种超级复杂的平衡树。实现任何一种新的Collection的子类都不是件容易的事情,因为要对付并发的读写,读一下Java源代码,你会发现大量用到信号灯机制。
24 楼 langyu 2009-05-26  
pricecome 写道
问问在treemap中如何实现可以重复的key?
还可以排序?
如果treemap不行,哪个可以?


这个没研究过,但只要是map,key就不会重复的吧
23 楼 pricecome 2009-05-26  
问问在treemap中如何实现可以重复的key?
还可以排序?
如果treemap不行,哪个可以?
22 楼 langyu 2009-05-26  
dmewy 写道
sql排序好直接封装就好了..
整这干什么?
怎样写一个高效能的sql才是王道.

我们在应用中使用map,和sql可能没关系吧。
操作数据库和操作内存......
21 楼 dmewy 2009-05-26  
sql排序好直接封装就好了..
整这干什么?
怎样写一个高效能的sql才是王道.
20 楼 whaosoft 2009-05-25  
抛出异常的爱 写道
BidiMap可以...试试
apache collections

这个没用过 怎么样这个??
19 楼 抛出异常的爱 2009-05-25  
langyu 写道
抛出异常的爱 写道
langyu 写道
javaeyebird 写道
搜索树是比较合适的选择
虽然TreeMap只比较key,但你可以写个类似的,加上value比较


这个想法不错,因为key-value对是一个entry,存储的时候也可以把他们翻过来,用value作为key
不过这里的"key"是可重复的
输出迭代时,再把key与value翻过来
差不多

把entry

重实现hash + compare方法
先比value 再比key
塞到set中去
反回set的iterator...不知道这方法的效率高否


对这个说法不太明白。
放到哪种Set中去?
先比较value的话,怎么处理value值相同的问题?


PS:起初不想使用set的原因是value是可重复的,还有HashSet还是把HashMap包装了一层,我觉着增加了复杂性。


中间借助set的了排序方式....
我喜欢用set来排序....
18 楼 langyu 2009-05-25  
抛出异常的爱 写道
langyu 写道
javaeyebird 写道
搜索树是比较合适的选择
虽然TreeMap只比较key,但你可以写个类似的,加上value比较


这个想法不错,因为key-value对是一个entry,存储的时候也可以把他们翻过来,用value作为key
不过这里的"key"是可重复的
输出迭代时,再把key与value翻过来
差不多

把entry

重实现hash + compare方法
先比value 再比key
塞到set中去
反回set的iterator...不知道这方法的效率高否


对这个说法不太明白。
放到哪种Set中去?
先比较value的话,怎么处理value值相同的问题?


PS:起初不想使用set的原因是value是可重复的,还有HashSet还是把HashMap包装了一层,我觉着增加了复杂性。

17 楼 抛出异常的爱 2009-05-25  
langyu 写道
javaeyebird 写道
搜索树是比较合适的选择
虽然TreeMap只比较key,但你可以写个类似的,加上value比较


这个想法不错,因为key-value对是一个entry,存储的时候也可以把他们翻过来,用value作为key
不过这里的"key"是可重复的
输出迭代时,再把key与value翻过来
差不多

把entry

重实现hash + compare方法
先比value 再比key
塞到set中去
反回set的iterator...不知道这方法的效率高否
16 楼 langyu 2009-05-25  
javaeyebird 写道
搜索树是比较合适的选择
虽然TreeMap只比较key,但你可以写个类似的,加上value比较


这个想法不错,因为key-value对是一个entry,存储的时候也可以把他们翻过来,用value作为key
不过这里的"key"是可重复的
输出迭代时,再把key与value翻过来
差不多
15 楼 javaeyebird 2009-05-25  
搜索树是比较合适的选择
虽然TreeMap只比较key,但你可以写个类似的,加上value比较
14 楼 case0079 2009-05-25  
引用
1.HashMap的key, value都是object,而我现在只想比较数值类型的key或value的对象。对于所有数值型,怎么做个通用的比较方法呢?(我先把它们转成Number类,再强制转成double类型进行比较,总觉的这种方法很山寨)。


2.对象多的时候,插入很慢的。它要从链表头一个接一个的比较对象,速度奇慢无比,怎么能优化下呢?(网上找“查找有序链表”时,都是那个key等于key或value,而我现在想要的不是“等于”而是“接近”,也就是如何生成一个有序链表)


第一条,没啥好办法.
第二条,应该是用树型的结构吧.
13 楼 langyu 2009-05-25  
woaiwofengkuang 写道
langyu 写道
抛出异常的爱 写道
BidiMap可以...试试
apache collections


刚看了下BidiMap的介绍
引用
This map enforces the restriction that there is a 1:1 relation between keys and values, meaning that multiple keys cannot map to the same value.


这条可能会影响map的使用吧,至少平时我们对value没有什么限制的。


你上边不是说只想处理数值开的吗,怎么现在对value又没有限制了。



至少这个value是可以重复的数值吧。
12 楼 抛出异常的爱 2009-05-25  
你用set存这些数据吧...不要用map...
11 楼 woaiwofengkuang 2009-05-25  
langyu 写道
抛出异常的爱 写道
BidiMap可以...试试
apache collections


刚看了下BidiMap的介绍
引用
This map enforces the restriction that there is a 1:1 relation between keys and values, meaning that multiple keys cannot map to the same value.


这条可能会影响map的使用吧,至少平时我们对value没有什么限制的。


你上边不是说只想处理数值开的吗,怎么现在对value又没有限制了。

10 楼 langyu 2009-05-25  
抛出异常的爱 写道
BidiMap可以...试试
apache collections


刚看了下BidiMap的介绍
引用
This map enforces the restriction that there is a 1:1 relation between keys and values, meaning that multiple keys cannot map to the same value.


这条可能会影响map的使用吧,至少平时我们对value没有什么限制的。
9 楼 抛出异常的爱 2009-05-25  
BidiMap可以...试试
apache collections

相关推荐

    简单的key value hashmap

    哈希映射(HashMap)是Java编程语言中一个非常重要的数据结构,它在《简单的key value hashmap》中被提及,通常用于存储键值对(key-value pairs)。HashMap是Java集合框架的一部分,它提供了高效的查找、插入和删除...

    HashMap通过VALUE反向求KEY的方法

    在Java编程中,HashMap是一种常用的集合类,它用于存储键值对(KEY-VALUE)的数据结构。HashMap允许我们在常量时间内快速访问数据,基于哈希表的原理实现。当我们需要根据键来查找值时,HashMap提供了高效的方式。...

    java程序员面试题

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    易语言HashMap类

    易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。HashMap类基于哈希表(Hash Table)原理,通过计算键的散列值来确定数据在内存中的...

    Hashmap 通过对VALUE排序 源代码

    HashMap是Java编程语言中最常用的集合类之一,它提供了一种基于键值对(key-value pair)的数据存储方式,允许我们通过键快速查找对应的值。在Java的HashMap中,元素是无序的,也就是说,它们在内存中的存储位置并...

    (源码)基于C++的简易KeyValue数据库系统.zip

    1. 内存映射文件存储通过内存映射文件的方式实现KeyValue数据的存储,提高了数据的读写效率。 2. 哈希表索引使用哈希表实现Key的索引,支持内存索引的重建和维护操作,提高了查询效率。 3. 最小堆实现通过最小堆...

    对Map按key和value分别排序

    Map 是键值对的集合接口,它的实现类主要包括 HashMap、TreeMap、Hashtable 及 LinkedHashMap 等。其中,TreeMap 是基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据...

    JCF(List、Set、Map)学习,实现了<key,value>按value排序噢

    标题中提到的“JCF(List、Set、Map)学习,实现了&lt;key,value&gt;按value排序”是一个关键点,我们将深入探讨这个话题。 首先,让我们了解List、Set和Map的区别。List是有序的集合,允许重复元素,并且可以保持插入顺序...

    Javascript实现和操作HashMap

    HashMap的核心思想是通过哈希函数将键(key)映射到一个桶(bucket)中,以此实现快速存取。在JavaScript中,我们可以利用对象(object)作为HashMap的基础,因为JavaScript的对象本质上就是一个键值对的集合,其...

    Java基础-模拟HashMap集合(基于数组和链表) 数组和链表.pdf

    什么是HashMap? HashMap是一种基于散列表的数据结构,用于存储键值对(key-value pair)。它的主要特点是可以快速地存储、检索和删除数据。HashMap的实现基于Hash函数和链表,通过Hash函数将键转换为索引,然后将...

    Spring 读取properties文件key+value方式.rar

    Spring框架提供了强大的属性配置管理,能够帮助开发者轻松地读取和使用properties文件中的key-value对。本教程将深入探讨如何在Spring中以不同的方式读取properties文件,以便更好地理解和应用这些配置。 首先,...

    嵌套Map或者List获取key、value值

    获取嵌套Map的key和value通常涉及两个步骤:首先,找到嵌套Map的位置,然后从中提取key和value。在Java中,这可以通过`get()`方法实现: ```java String userId = "123"; Map, String&gt; userInfo = users.get(userId...

    java HashMap原理分析

    Java HashMap是一种基于哈希表的数据结构,它的存储原理是通过将Key-Value对存储在一个数组中,每个数组元素是一个链表,链表中的每个元素是一个Entry对象,Entry对象包含了Key、Value和指向下一个Entry对象的引用。...

    Java HashMap类详解

    HashMap 的存储实现可以通过查看其 put(K key, V value) 方法的源代码来了解。该方法首先判断 key 是否为 null,然后根据 key 的 hashCode 值计算 Hash 值,接着搜索指定 hash 值在对应 table 中的索引,如果 i 索引...

    自定义map实现java的hashmap

    - 键(Key):HashMap中的每个元素由一个键和一个值组成,键是唯一的,不允许重复。 - 值(Value):键对应的值,可以重复。 - 哈希码(Hash Code):键对象通过hashCode()方法计算得到的整数值,用于定位元素在...

    基于JavaScript的HashMap实现

    2. **插入**:`put(key, value)`方法允许我们将键值对插入HashMap中。如果键已经存在,则更新对应的值。 3. **获取**:`get(key)`方法根据键返回对应的值。如果键不存在,返回undefined。 4. **删除**:`delete...

    学习笔记:三数组实现的HashMap

    - **HashMap**:HashMap是Java集合框架的一部分,它通过哈希函数将键(Key)映射到对应的值(Value),形成键值对。键必须是唯一的,而值可以重复。 - **哈希表**:HashMap的核心数据结构是哈希表,通常由一个数组...

    HashMap的实现原理

    ### HashMap的实现原理 #### 1. HashMap概述 HashMap 是 Java 集合框架中一个非常重要的类,它实现了 Map 接口,并提供了基于哈希表的存储方式。与其它 Map 实现不同的是,HashMap 允许使用 `null` 键和 `null` 值...

    MATLAB哈希映射实现_hashmap_algorithm

    get(key) -&gt; get value associated with key set(key,value) -&gt; set new element in map by key and value delete(key) -&gt; delete entry by key has(key) -&gt; Returns true/false based on whether the map contains ...

    HashMap总结

    HashMap 是 Java 中的一种常用的数据结构,用于存储键值对(Key-Value)数据。下面是 HashMap 的一些特性和使用方法总结。 键(Key)的特性 1. 键可以为 null:HashMap 中的键可以为 null,这意味着可以将 null ...

Global site tag (gtag.js) - Google Analytics