黑马程序员技术交流社区
标题:
在网上看到的一道面试题求高手解答!!!!
[打印本页]
作者:
商秀川
时间:
2012-10-10 21:23
标题:
在网上看到的一道面试题求高手解答!!!!
实例一个巨大但有限容量的map,当元素数量达到上限后,新加入的对象映射关系将替换最近不常用的对象映
射关系。
作者:
柏占肖
时间:
2012-10-10 21:46
呵呵……有意思,我试试看
作者:
柏占肖
时间:
2012-10-11 00:26
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MainClass {
public static void main(String[] args) {
MyMap myMap = new MyMap(3);// 定义上限为3
for (int i = 10, j = 100; i < 20; i++, j++) {
myMap.put(i, j);// 放入键值对
myMap.get(10);// 使用键为10的键值对
myMap.get(11);// 使用键为11的键值对
myMap.get(15);// 使用键为15的键值对
}
}
}
class MyMap {
private Map map = null;
private int toplimit;// 上限
public MyMap(int toplimit) {
this.toplimit = toplimit;
map = new HashMap();// map指向一个HashMap对象
}
public void put(Object key, Object value) {
Set<Key> set = map.keySet();// map中的所有键放入一个set中
System.out.println("放入");
if (map.size() == toplimit) {// 达到上限
System.out.println("Map对象的容量已达到上限");
if (!set.contains(key)) {// 如果这个键是新放入的则执行下面的代码
int minAccessTimes = ((Key) set.toArray()[0]).accessTimes;
for (Object k : set) {
if (minAccessTimes > ((Key) k).accessTimes) {
minAccessTimes = ((Key) k).accessTimes;// 取出访问量最少的次数
}
}
for (Key k : set) {
if (minAccessTimes == k.accessTimes) {// 前面找出的最少 的次数来找到对应的键
map.remove(k);// 移出这个键值对
break;
}
}
}
}
map.put(new Key(key), value);// 放入新的键值对
for (Key k : set) {
System.out.println(k.key + "," + map.get(k).toString() + ","
+ k.accessTimes);
}
}
public Object get(Object key) {
System.out.println("使用");
Set<Key> set = map.keySet();
Object value = null;
for (Key k : set) {
if (k.key.equals(key)) {
++k.accessTimes;// 每使用一次访问量加1
value = map.get(key);
}
}
for (Key k : set) {
System.out.println(k.key + "," + map.get(k).toString() + ","
+ k.accessTimes);
}
return value;
}
class Key {
private int accessTimes = 0;// 存放这个键值对的访问量
private Object key = null;// 存放原始的键
public Key(Object key) {
this.key = key;
}
}
}
复制代码
看看吧,个人觉得功能算是实现了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2