一面试题,问数组是否可以实现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());
}
}