用數組實現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());
 }
}

發佈了37 篇原創文章 · 獲贊 19 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章