360笔试题目-HashMap实现
自定义一个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>