一面試題,問數組是否可以實現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());
}
}