黑马程序员技术交流社区

标题: 在网上看到的一道面试题求高手解答!!!! [打印本页]

作者: 商秀川    时间: 2012-10-10 21:23
标题: 在网上看到的一道面试题求高手解答!!!!
实例一个巨大但有限容量的map,当元素数量达到上限后,新加入的对象映射关系将替换最近不常用的对象映

射关系。
作者: 柏占肖    时间: 2012-10-10 21:46
呵呵……有意思,我试试看
作者: 柏占肖    时间: 2012-10-11 00:26
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.Set;

  4. public class MainClass {
  5.         public static void main(String[] args) {
  6.                 MyMap myMap = new MyMap(3);// 定义上限为3
  7.                 for (int i = 10, j = 100; i < 20; i++, j++) {
  8.                         myMap.put(i, j);// 放入键值对
  9.                         myMap.get(10);// 使用键为10的键值对
  10.                         myMap.get(11);// 使用键为11的键值对
  11.                         myMap.get(15);// 使用键为15的键值对
  12.                 }
  13.         }
  14. }

  15. class MyMap {
  16.         private Map map = null;
  17.         private int toplimit;// 上限

  18.         public MyMap(int toplimit) {
  19.                 this.toplimit = toplimit;
  20.                 map = new HashMap();// map指向一个HashMap对象
  21.         }

  22.         public void put(Object key, Object value) {
  23.                 Set<Key> set = map.keySet();// map中的所有键放入一个set中
  24.                 System.out.println("放入");
  25.                 if (map.size() == toplimit) {// 达到上限
  26.                         System.out.println("Map对象的容量已达到上限");

  27.                         if (!set.contains(key)) {// 如果这个键是新放入的则执行下面的代码
  28.                                 int minAccessTimes = ((Key) set.toArray()[0]).accessTimes;
  29.                                 for (Object k : set) {
  30.                                         if (minAccessTimes > ((Key) k).accessTimes) {
  31.                                                 minAccessTimes = ((Key) k).accessTimes;// 取出访问量最少的次数
  32.                                         }
  33.                                 }
  34.                                 for (Key k : set) {
  35.                                         if (minAccessTimes == k.accessTimes) {// 前面找出的最少 的次数来找到对应的键
  36.                                                 map.remove(k);// 移出这个键值对
  37.                                                 break;
  38.                                         }
  39.                                 }
  40.                         }
  41.                 }
  42.                 map.put(new Key(key), value);// 放入新的键值对
  43.                 for (Key k : set) {
  44.                         System.out.println(k.key + "," + map.get(k).toString() + ","
  45.                                         + k.accessTimes);
  46.                 }
  47.         }

  48.         public Object get(Object key) {
  49.                 System.out.println("使用");
  50.                 Set<Key> set = map.keySet();
  51.                 Object value = null;
  52.                 for (Key k : set) {
  53.                         if (k.key.equals(key)) {
  54.                                 ++k.accessTimes;// 每使用一次访问量加1
  55.                                 value = map.get(key);
  56.                         }
  57.                 }
  58.                 for (Key k : set) {
  59.                         System.out.println(k.key + "," + map.get(k).toString() + ","
  60.                                         + k.accessTimes);
  61.                 }
  62.                 return value;
  63.         }

  64.         class Key {
  65.                 private int accessTimes = 0;// 存放这个键值对的访问量
  66.                 private Object key = null;// 存放原始的键

  67.                 public Key(Object key) {
  68.                         this.key = key;
  69.                 }
  70.         }
  71. }
复制代码
看看吧,个人觉得功能算是实现了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2