首页 > 其他 > 详细

360笔试题目-HashMap实现

时间:2015-04-25 18:19:25      阅读:372      评论:0      收藏:0      [点我收藏+]
自定义一个HashMap,实现map_put,map_delete,map_get方法,要求:

     1.查找时间复杂度O(1)

     2..

     3..

   因为Java中自带HashMap,平时直接用,也没有考虑,前一段时间只是实现了ArrayList,Vetor,Quene,并没有考虑HashMap。笔试的时候由于时间紧,我只是在HashMap中定义两个ArrayList,一个保存Key,一个保存Value,现在想想肯定是不对的,这根本没有按照要求实现。题目的原意是让实现链表,考察操作链表的能力。回来之后,我想了想,用Java实现了一般的链表:

     

<span style="font-size:14px;">/**
 * 
 * @author lip
 * 用拉链法实现hashMap
 * 原理:hashmap中有一个链表数组
 *   一般数组的大小为一个素数
 */
public class HashMap<T1,T2>
	{
        private final int LENGTH=31;
        private Entry<T1, T2>[]table;
        private int size=0;
		public HashMap()
			{
				table=new Entry[LENGTH];
			}
		//向hashMap插入值
        public void put(T1 key,T2 value)
        {
        	size++;
        	//求出T1的hash值,然后p=hash(key)%LENGTH,将key放在数组中p位置处的链表中
        	//如果map中存在该值,那么更新该值
        	//不存在该值,那么插在链表最后一个位置
        	int pos=key.hashCode()%LENGTH;
        	if(table[pos]==null)
        		{
        		  table[pos]=new Entry<T1,T2>(key,value);
        		  return;
        		}
        	//遍历list,看key-value是否已经存在
        	Entry<T1, T2> entry=table[pos];
        	boolean exist=false;
		    while (table[pos] != null)
				{
					if (table[pos].key == key)// 存在,更新就可以了
						{
							table[pos].value = value;
							size--;
							exist = true;
							break;
						}
					if(table[pos].next==null)
						break;
					else table[pos] = table[pos].next;
				}
        	if(!exist)
        		table[pos].next=new Entry<T1,T2>(key,value);
        	table[pos]=entry;
        
        }
        //删除一个key
        public void delete(T1 key)
        {
        	int pos=key.hashCode()%LENGTH;
        	Entry<T1, T2> entry=table[pos];
        	while(entry!=null)
        		{
        			if(entry.key==key)
        				{
        				  //删除当前接节点
        					Entry<T1, T2>tempEntry=entry.next;
        					entry=entry.next;
        					if(entry!=null)
        						entry.next=tempEntry.next;
        					size--;
        					break;
        				}
        			entry=entry.next;
        		}
        }
        //得到key的value
        public T2 getValue(T1 key)
        {
        	int pos=key.hashCode()%LENGTH;
        	Entry<T1, T2>entry=table[pos];
        	while(entry!=null)
        		{
        			if(entry.key==key)
        				return entry.value;
        			entry=entry.next;
        		}
        	return null;
        }
        //得到key的集合
        public Set<T1> getKeySet()
        {
        	Set<T1> set=new HashSet<T1>();
        	for(int i=0;i<LENGTH;i++)
        		{
        			Entry<T1, T2> entry=table[i];
        			while(entry!=null)
        				{
        				   set.add(entry.key);
        				   entry=entry.next;
        				}
        		}
        	return set;
        }
        //得到map的大小
        public int size()
        {
        	return size;
        }
		class Entry<T1,T2>
			{
				private T1 key;
				private T2 value;
				public Entry<T1, T2>next;
				public  Entry(T1 key,T2 value)
				{
					this.key=key;
					this.value=value;
				}
			}
		public static void main(String[] args)
			{
				// TODO Auto-generated method stub
                HashMap<String, Integer>hashMap=new HashMap<String, Integer>();
                hashMap.put("语文", 82);
                hashMap.put("数学", 99);
                hashMap.put("英语", 90);
                hashMap.put("物理", 88);
                hashMap.put("化学", 93);
                hashMap.put("生物", 86);
                hashMap.put("生物", 88);
                System.out.println("HashMap Size:"+hashMap.size());
                System.out.println("生物:"+hashMap.getValue("生物"));
                System.out.println("语文:"+hashMap.getValue("语文"));
                Set<String> set=hashMap.getKeySet();
                for(Iterator<String> iterator=set.iterator();iterator.hasNext();)
                	{
                		String key=iterator.next();
                		System.out.println(key+":"+hashMap.getValue(key));
                	}
			}

	}</span>
运行如图:

      技术分享

360笔试题目-HashMap实现

原文:http://blog.csdn.net/yilip/article/details/45272021

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!