zoukankan      html  css  js  c++  java
  • js实现hashtable的赋值、取值、遍历

      哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值、取值、遍历、排序操作提高效率。想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面的出现最多的次数,那么这里我们可能就要用Hashtable的相关知识了。Javascript中,object的实现就是hash表,因此只要在object上封装点方法,再利用原生的hasOwnProperty方法就可以实现简单高效的hashtable。

    一,什么是哈希表(Hashtable)

    二,哈希表的简单操作

    三,js模拟哈希表的简单操作

    一,什么是哈希表(Hashtable)

       Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

    二,哈希表的简单操作C#

      在哈希表中添加一个key/value键值对:

    HashtableObject.Add(key,value);

      在哈希表中去除某个key/value键值对:

    HashtableObject.Remove(key);

      从哈希表中移除所有元素:

    HashtableObject.Clear();

      判断哈希表是否包含特定键key:

    HashtableObject.Contains(key);

    三,js模拟哈希表的简单操作

        HashTable.prototype = {
                    contructor:HashTable,
                    //初始化
                    initialize:function(){
                        this.obj = {};
                    },
                    //获取hashTable中对象唯一出现的次数
                    count:function(){
                        var count = 0;
                        for(var i in this.content) count++;
                        return count;
                    },
                    //返回hashTable中的值
                    items:function(key){
                        if(this.contains(key)){
                            return this.obj[key];
                        }
                    },
                    //增加值到hashtable
                    add:function(key,value){
                        if(this.obj.hasOwnProperty(key)){
                            return false;
                        }else{
                            this.obj[key] = value;
                            return true;
                        }
                    },
                    //清空hashtable中的值
                    clear:function(){
                        this.obj = {};
                    },
                    //检测hashTable对象中是否含有此属性
                    contains:function(key){
                        return this.obj.hasOwnProperty(key);
                    },
                    //移除hashTable中对象的值
                    remove:function(key){
                        delete this.obj[key];
                    }
                } 

      这样我们就能像c#语言里面的那样进行操作了。

      还一个简单的变体版:

            // js哈希表 
            function HashTable() { 
                this.ObjArr = {}; 
                this.Count = 0; 
                //添加 
                this.Add = function(key, value) { 
                    if (this.ObjArr.hasOwnProperty(key)) { 
                        return false; //如果键已经存在,不添加 
                    }else { 
                        this.ObjArr[key] = value; 
                        this.Count++; 
                        return true; 
                    } 
                } 
                //是否包含某项 
                this.Contains = function(key) { 
                    return this.ObjArr.hasOwnProperty(key); 
                } 
                //取某一项 其实等价于this.ObjArr[key] 
                this.GetValue = function(key){ 
                    if (this.Contains(key)) { 
                        return this.ObjArr[key]; 
                    }else { 
                        throw Error("Hashtable not cotains the key: " + String(key)); //脚本错误 
                        //return; 
                    } 
                } 
                //移除 
                this.Remove = function(key) { 
                    if (this.Contains(key)) { 
                        delete this.ObjArr[key]; 
                        this.Count--; 
                    } 
                } 
                //清空 
                this.Clear = function(){ 
                    this.ObjArr = {}; this.Count = 0; 
                } 
            }         
                    
            //员工 
            function employee(id, userName) { 
                this.id = id; 
                this.userName = userName; 
            } 
            function test() { 
                var ht = new HashTable(); 
                var tmpEmployee = null; 
                for (var i = 1; i < 6; i++) { 
                    tmpEmployee = new employee(i, "Employee_" + i); 
                    ht.Add(i, tmpEmployee); 
                } 
                for (var i = 1; i <= ht.Count; i++) { 
                    alert(ht.GetValue(i).userName); //其实等价于ht.ObjArr[i].userName 
                    //alert(ht.ObjArr[i].userName); 
                } 
                ht.Remove(1); 
                alert(ht.Contains(1)); //false 
                alert(ht.Contains(2)); //true 
                //alert(ht.GetValue(1)); //异常 
                var result = ht.GetValue(2); 
                if (result != null) { 
                    alert("Employee Id:" + result.id + ";UserName:" + result.userName); 
                } 
                ht.Add(2, "这一个key已经存在!"); //Add无效 
                //ht.Clear(); //清空 
                alert(ht.Count); 
            }     

      最后解决一下,开头说的那个问题

            Array.prototype.maxNum = function(){
                var arr = this,obj={};
                for(var i =0, len=arr.length;i<len;i++){
                    var key = arr[i];
                    if( ! obj[key]){
                        obj[key] = 1;
                    }else{
                        obj[key]++;
                    }
                }
                var max = -1,maxStr;
                for( key in obj){
                    if(obj[key]>max){
                        max = obj[key];
                        maxStr = key;
                    }
                }
                //alert(maxStr);
                return [maxStr,max];
            }

    资料来源:C#中hashtable的赋值、取值、遍历、排序操作

         利用hasOwnProperty实现的高效的javascript hashtable 

  • 相关阅读:
    单选按钮控件(Ridio Button)的使用
    带属性页的对话框
    异常处理与MiniDump详解(4) MiniDump
    单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解
    VC更换图标文件
    http://user.qzone.qq.com/2413264738/2
    安装包安装 执行有相对路径的程序不能正确运行
    如何将 jar 包导入Maven 本地仓库
    19、访问者设计模式
    11、装饰器模式
  • 原文地址:https://www.cnblogs.com/pingfan1990/p/4332504.html
Copyright © 2011-2022 走看看