用数组实现Map功能

一面试题,问数组是否可以实现map以及如何实现,当时只知道可以,时间紧没认真考虑,后来回来查了下网络,发现好多示例,

随便测试了几个发现了有些小问题,于是自己尝试扩展和写了一个,也加深了对数组的理解,于是贴出来互相学习下。

 

<!------------下面代码直接考入Eclipse运行---------------------------->

 

package algorithm;

import java.util.Arrays;
import java.util.Collection;

/***
 * 简单的Map实现,采用二维数组实现(ArrayImplMap<String,String>)
 * 1、新建或扩充数组
 * 2、判断是否有值:
 *    Y:覆盖
 *    N:新增
 * @author huawei
 *
 */
public class ArrayImplMap {
 private int index = 0;
 private String[][] map= null;
 /*相当于new一个HashMap*/
 public ArrayImplMap(){
  if(map == null)
   map = new String[0][0];
 }
 /**
  * 存储数据(如果Key值重复,则会被覆盖掉)
  * @param k key值
  * @param v value值
  */
 public void put(String k,String v){
  boolean flag = isRepeat(map, k, v);//查看是否重复,如果重复则直接替换新的Value值
  if(!flag){
   map = getAddSize(map,index+1);//将数组空间增加一条存储位置,用于下面存储一条新数据。
   map[index][0] = k;
   map[index][1] = v;
   index++;
  }
 }
 /*清除map内数据*/
 public void clear(){
  index = 0;
  map = new String[0][0];
 }
 /*判断Map是否为空*/
 public boolean isEmpty(){
  return map.length == 0;
 }
 /*通过Key值获取数据 */
 public String get(String key){
  String value = null;
  for(int i=0;i<map.length;i++){
   if(key.equals(map[i][0])){
    value = map[i][1];
    break;
   }
  }
  return value;
 }
 
 /*Map总长度 */
 public int size(){
  return map.length;
 }
 /*是否包含K的值 */
 public boolean containsKey(String key){
  return isContainsKey(key,0);
 }
 /*是否包含V的值 */
 public boolean containsValue(String value){
  return isContainsKey(value,1);
 }
 /*返回所有V的集合*/
 public Collection<String> values(){
  Collection<String> values =  Arrays.asList(values(1));
  return values;
 }
 
 /**
  * 扩充空间:增加二维数组的存储空间,数据不变
  * @param map 要增长的数组
  * @param length 新的长度
  * @return
  */
 private String[][] getAddSize(String[][] map,int length){
  if(map ==null)
   map = new String[1][2];// 创建单条数据数组长度
  String[][] tmp = new String[length][2];//创建新的数组
  System.arraycopy(map, 0, tmp, 0, map.length);//将原始数据拷贝到新的数组中
  map = null;//不需要了,等待自动垃圾回收
  return tmp;
 }
 
 /*二维数组,根据传入参数考虑取得K的值还是V的值*/
 private String[] values(int ind){
  String[] v = new String[map.length];
  for(int i=0;i<map.length;i++){
   v[i] = map[i][ind];
  }
  return v;
 }
 /*二维数组,判断是否保存K或V*/
 private boolean isContainsKey(String key,int ind) {
  boolean flag = false;
  for(int i=0; i < map.length; i++){
   if(key.equals(map[i][ind])){//查看是否存在此Key值
    flag = true;
    break;
   }
  }
  return flag;
 }
 
 private boolean isRepeat(String[][] s,String k,String v){
  boolean flag = false;
  for(int i=0; i < s.length; i++){
   if(k.equals(s[i][0])){//查看是否存在此Key值
    s[i][1] = v;//使用新的Value值
    flag = true;
    break;
   }
  }
  return flag;
 }
 
 public static void main(String[] args) {
  ArrayImplMap map = new ArrayImplMap();
  System.out.println(map.size());
  map.put("k", "k");
  map.put("k", "k");
  map.clear();
  System.out.println(map.size());
  map.put("k", "k");
  map.put("v", "q");
  map.put("o", "d");
  map.put("t", "k");
  System.out.println(map.size());
  System.out.println(map.containsKey("b"));
  System.out.println(map.containsValue("k"));
  map.clear();
  map.put(null, null);
  System.out.println(map.values());
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值