`

以前写的一个简单的顺序敏感的HashMap

阅读更多
HashMap 是无序的.
这段代码是我写的一个可以间接实现有序 HashMap的代码.
写的不好 见笑了
顺便问一下,网上现在有没有更好 更高效的类似的代码?

package com.wzj;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author fins  build 2006-07-18
 *	顺序敏感的HashMap
 *	get(int idx)/remove(int idx) 为按加入hashMap的顺序号(index) 来取得/删除 数据
 */
public class IndexHashMap extends HashMap  {

	private static final long serialVersionUID = 1L;

	private List list=new ArrayList();
	

	public Object put(Object key, Object value) {
		if (!containsKey(key)){
			list.add(key);
		}
		return super.put(key, value);
	}

	
	public Object get(int idx){
		return super.get(getKey(idx));
	}
	public int getIndex(Object key){
		return list.indexOf(key);
	}
	public Object getKey(int idx){
		if (idx>=list.size()) return null;
		return list.get(idx);
	}
	
	public void remove(int idx){
		Object key=getKey(idx);
		removeFromList(getIndex(key));
		super.remove(key);
	}
	
	public Object remove(Object key) {
		removeFromList(getIndex(key));
		return super.remove(key);
	}
	
	public void clear() {
		this.list = new ArrayList();
		super.clear();
	}
	private void removeFromList(int idx){
		if (idx<list.size() && idx>=0) {
			list.remove(idx);
		}
	}


}
分享到:
评论
6 楼 fins 2006-11-03  
楼上的 看完帖子再发言啊

LinkedHashMap 也是不能随机存取的啊
5 楼 Feiing 2006-11-02  
晕, 没用过 java.util.LinkedHashMap ?
4 楼 fins 2006-11-02  
哈哈 我咋就没想到呢
高手!谢谢 buaawhl
学习!
3 楼 buaawhl 2006-11-02  

hehe, API说明不详,有些误导。

实现上提出一个小建议。
可以不用继承,用包含。使用proxy pattern。
这样就可以对任意 Map 进行截获处理,而不只是 HashMap。

先来一个通用的ProxyMap。如果不需要重用,这个类可以不用写。主要为了展示Proxy,delegate。

public class ProxyMap {
	protected Map map;

	public ProxyMap(Map map) {
		super();
		this.map = map;
	}

	public Map getMap() {
		return map;
	}

	public void clear() {
		map.clear();
	}

	public boolean containsKey(Object key) {
		return map.containsKey(key);
	}

	public boolean containsValue(Object value) {
		return map.containsValue(value);
	}

	public Set entrySet() {
		return map.entrySet();
	}

	public boolean equals(Object o) {
		return map.equals(o);
	}

	public Object get(Object key) {
		return map.get(key);
	}

	public int hashCode() {
		return map.hashCode();
	}

	public boolean isEmpty() {
		return map.isEmpty();
	}

	public Set keySet() {
		return map.keySet();
	}

	public Object put(Object arg0, Object arg1) {
		return map.put(arg0, arg1);
	}

	public void putAll(Map arg0) {
		map.putAll(arg0);
	}

	public Object remove(Object key) {
		return map.remove(key);
	}

	public int size() {
		return map.size();
	}

	public Collection values() {
		return map.values();
	}
}



--------------------------------

IndexMap 继承 ProxyMap。
如果没有ProxyMap这个类,那么就不用继承。
需要自己实现所有Map的delegate方法。

IndexMap的代码几乎和 fins 给出的一样(就是copy过来的)。
只是可以截获所有的Map。而不只是HashMap。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class IndexMap extends ProxyMap{

	public IndexMap(Map map) {
		super(map);
	}
	
	 private List list = new ArrayList();

	 public Object put(Object key, Object value) {
	 if (!containsKey(key)){
	 list.add(key);
	 }
	 return super.put(key, value);
	 }

	 public Object get(int idx){
	 return super.get(getKey(idx));
	 }
	 public int getIndex(Object key){
	 return list.indexOf(key);
	 }
	 public Object getKey(int idx){
	 if (idx>=list.size()) return null;
	 return list.get(idx);
	 }
	 public void remove(int idx){
	 Object key=getKey(idx);
	 removeFromList(getIndex(key));
	 super.remove(key);
	 }
	 public Object remove(Object key) {
	 removeFromList(getIndex(key));
	 return super.remove(key);
	 }
	 public void clear() {
	 this.list = new ArrayList();
	 super.clear();
	 }
	 private void removeFromList(int idx){
	 if (idx<list.size() && idx>=0) {
	 list.remove(idx);
	 }
	 }
}



2 楼 fins 2006-11-02  
这个我知道 但是用法和我写的这个不太一样
你仔细看看
TreeMap和我需要的效果不一样

从treeMap里 不能随机取数据
只有在遍历的时候才能按顺序取

例如 我想取 treemap里 第5个加入的数据
1 楼 buaawhl 2006-11-02  

TreeMap class implements SortedMap interface.

相关推荐

    Java集合框架常见面试题.pdf

    Java集合框架是Java编程语言中一个至关重要的部分,它提供了数据结构和算法的抽象,使得开发者可以方便地存储和管理各种类型的数据。本篇将详细探讨Java集合框架中常见的面试题,包括List、Set、Map三者的区别以及...

    2021-3月Java面试题.docx

    Java集合框架是Java编程中非常重要的一个组成部分,它提供了存储和操作对象的高效方式。面试中,关于Java集合框架的问题经常出现,特别是对于List、Set、Map三大接口的理解及其实现类的特性。以下是对这些知识点的...

    Java面试题和答案72道.docx

    Java集合框架是Java编程语言中一个非常重要的概念,它提供了一种高效且灵活的方式来存储和管理数据。在Java面试中,对于集合的理解和熟练运用通常是评估候选人能力的关键部分。以下是一些关于Java集合框架的核心知识...

    3.java集合面试题1

    - **Null支持**:HashMap允许一个key为null,可以有多个null值,而HashTable不支持null键值对,尝试put null会抛出NullPointerException。 - **初始容量与扩容**:HashMap默认初始容量为16,而Hashtable默认11,扩...

    涵盖了90%以上的面试题

    11. **类和接口的限制**: 一个 .java 文件可以包含多个类,但只能有一个公共类(主类),且主类名应与文件名相同。内部类可以在一个类内部定义。 12. **JVM 内存模型**: JVM 分为堆内存、栈内存、方法区(JDK 1.8 ...

    J2se外企it面试题

    - Overload(重载):在同一个类中,方法名相同但参数列表不同(参数数量、类型或顺序不同)。 - Override(重写):子类方法与父类方法同名、同参数列表,子类方法覆盖父类方法。 16. **Set中元素的判断**:在...

    java中map集合的用法.pdf

    创建Map对象时,通常会指定一个具体的实现类,如HashMap。例如: ```java Map, String&gt; map = new HashMap(); ``` 这里创建了一个HashMap实例,其中键和值都是字符串类型。 2. **插入元素** 使用`put()`方法...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...

    java面试题

    在Java中,如果一个类继承了另一个类,那么执行顺序遵循以下规则: 1. 先执行父类的构造函数。 2. 然后执行子类构造函数。 #### 12. 内部类的实现方式? 内部类可以分为匿名内部类、局部内部类、静态内部类等。 ##...

    JAVA程序员面试三十二问

    - 创建`String s = new String("xyz")`会创建两个对象,一个是常量池中的"xyz",另一个是堆中的新对象。 10. **Math.round()** - `Math.round(11.5)`等于12,`Math.round(-11.5)`等于-11。 11. **short变量自增...

    世界500强面试题.pdf

    1.6.3. 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数 位于数组的后半部分 ...........................................................130 1.6.4. 给定链表的头指针和一个...

Global site tag (gtag.js) - Google Analytics