javascript函数库-集合框架


Posted in Javascript onApril 27, 2007

Classes:
Collections
Arrays
ArrayList
SortedList extends ArrayList
HashMap
HashSet
*/

/****************
Collections
NOTE:sort() return a new List
****************/
function Collections(){}
Collections.sort=function(){
if(arguments.length==1){
 var s=new SortedList();
 s.addAll(arguments[0]);
 return s;
}
else if(arguments.length==2){
 var s=new SortedList();
 s.setComparator(arguments[1]);
 s.addAll(arguments[0]);
 return s;
}
else 
 throw "IllegalArgument";
}
/***************
Arrays
****************/
function Arrays(){}
Arrays.asList=function(arr){
return new ArrayList(arr);
}

//ListIterator
function ListIterator(table,len){
   this.table=table;
this.len=len;                          
   this.index=0;
 
this.hasNext=function() {
 return this.index< this.len;
   }

   this.next=function() { 
 if(!this.hasNext())
  throw "No such Element!";
 return this.table[this.index++];
   }
}

/********************
ArrayList
********************/
function ArrayList(){
this.buffer=new Array();
if(arguments.length>0) this.buffer=arguments[0];
this.length=this.buffer.length;
}
ArrayList.prototype.hashCode=function(){
var h=0;
for(var i=0;i<this.lengh;i++)
 h+=this.buffer[i].hashCode();
return h;
}

ArrayList.prototype.size=function(){
return this.length;
}

ArrayList.prototype.clear=function(){
for(var i=0;i<this.length;i++) this.buffer[i]=null;
this.buffer.length=0;
this.length=0;
}

ArrayList.prototype.isEmpty=function(){
return this.length==0;
}

ArrayList.prototype.toArray=function(){
var copy=new Array();
for(var i=0;i<this.length;i++){
 copy[i]=this.buffer[i];
}
return copy;
}
ArrayList.prototype.get=function(index){
if(index>=0 && index<this.length)
 return this.buffer[index];
return null;
}

ArrayList.prototype.remove=function(param){
var index=0;
 
if(isNaN(param)){
 index=this.indexOf(param);
}
else index=param;
  
if(index>=0 && index<this.length){
 for(var i=index;i<this.length-1;i++)
  this.buffer[i]=this.buffer[i+1];
  this.length-=1;
  return true;
}
else return false;
}
 
ArrayList.prototype.add=function(){
var args=arguments;
if(args.length==1){
 this.buffer[this.length++]=args[0];
 return true;
}
else if(args.length==2){
 var index=args[0];
 var obj=args[1];
 if(index>=0 && index<=this.length){
  for(var i=this.length;i>index;i--)
   this.buffer[i]=this.buffer[i-1];
  this.buffer[i]=obj;
  this.length+=1;
  return true;
 }
}
return false;
}

ArrayList.prototype.indexOf=function(obj){
for(var i=0;i<this.length;i++){
 if(this.buffer[i].equals(obj)) return i;
}
return -1;
}

ArrayList.prototype.lastIndexOf=function(obj){
for(var i=this.length-1;i>=0;i--){
 if(this.buffer[i].equals(obj)) return i;
}
return -1;
}

ArrayList.prototype.contains=function(obj){
return this.indexOf(obj)!=-1;
}

ArrayList.prototype.equals=function(obj){
if(this.size()!=obj.size()) return false;
for(var i=0;i<this.length;i++){
 if(!obj.get(i).equals(this.buffer[i])) return false;
}
return true;
}

ArrayList.prototype.addAll=function(list){
var mod=false;
for(var it=list.iterator();it.hasNext();){
 var v=it.next();
 if(this.add(v)) mod=true;
}
return mod;  
}

ArrayList.prototype.containsAll=function(list){
for(var i=0;i<list.size();i++){
 if(!this.contains(list.get(i))) return false;
}
return true;
}

ArrayList.prototype.removeAll=function(list){
for(var i=0;i<list.size();i++){
 this.remove(this.indexOf(list.get(i)));
}
}

ArrayList.prototype.retainAll=function(list){
for(var i=this.length-1;i>=0;i--){
 if(!list.contains(this.buffer[i])){
  this.remove(i);
 }
}
}

ArrayList.prototype.subList=function(begin,end){
if(begin<0) begin=0;
if(end>this.length) end=this.length;
var newsize=end-begin;
var newbuffer=new Array();
for(var i=0;i<newsize;i++){
 newbuffer[i]=this.buffer[begin+i];
}
return new ArrayList(newbuffer);
}
ArrayList.prototype.set=function(index,obj){
if(index>=0 && index<this.length){
 temp=this.buffer[index];
 this.buffer[index]=obj;
 return temp;
}
}

ArrayList.prototype.iterator=function iterator(){
return new ListIterator(this.buffer,this.length);
}

/*****************************
SortedList extends ArrayList
*****************************/
function SortedList(){
  this.com=null;
}
SortedList.prototype=new ArrayList();
SortedList.prototype.setComparator=function(comp){
if(this.length!=0) throw "Only can be set when list is empty";
this.com=comp;
}

SortedList.prototype.getComparator=function(){
return this.com;
}

//override
SortedList.prototype.add=function(obj){
var index = this.indexOf(obj);
for(var i=this.length;i>index;){
 this.buffer[i]=this.buffer[--i];
}

this.buffer[index]=obj;
this.length++; 
}
//override
SortedList.prototype.indexOf=function(obj){
if(this.length==0) return 0;
 
var min=0,max=this.length-1;
var mid=0;
while(min<=max){
  
 mid = (min+max) >> 1;
 var c=0;
 if(this.com==null) c=obj.compareTo(this.buffer[mid]);
 else c=this.com.compare(obj,this.buffer[mid]);
  
 if(c==0){
  return mid;
 }
 else if(c<0){
  max=mid-1;
 }
 else{
  min=mid+1;
 }
}
mid =(min+max) >>1;
return mid+1;
}
//override
SortedList.prototype.contains=function(obj){
if(this.length==0) return false;
var min=0,max=this.length-1;
var mid=0;
while(min<=max){
 mid = (min+max) >> 1;
 var c=0;
 if(this.com==null) c=obj.compareTo(this.buffer[mid]);
 else  c=this.com.compare(obj,this.buffer[mid]);
 if(c==0){
  return true;
 }
 else if(c<0){
  max=mid-1;
 }
 else{
  min=mid+1;
 }
}
return false;
}
//override
SortedList.prototype.subList=function(begin,end){
var sl=new SortedList();
s1.setComparator(this.com);
var sub=ArrayList.prototype.subList(begin.end);
sl.addAll(sub);
return sl;
}

/****************************
HashMap
****************************/

function Entry(h,k,v,n){
  this.value = v; 
  this.next = n;
  this.key = k;
  this.hash = h;

  this.getKey=function(){
 return this.key;
  }

  this.getValue=function() {
 return this.value;
  }
  this.setValue=function(newValue) {
 var oldValue = this.value;
 this.value = newValue;
 return oldValue;
  }

  this.equals=function(o){
  var e = o;
  var k1 = this.getKey();
  var k2 = e.getKey();
  var v1 = this.getValue();
  var v2 = e.getValue();
  return (k1.equals(k2) && v1.equals(v2));
  }

  this.hashCode=function() {
   return this.key.hashCode() ^ this.value.hashCode();
  }

  this.toString=function() {
 return this.getKey() + "=" + this.getValue();
  }
}

function HashIterator(table,index,ne){

this.table=table;
this.ne=ne;                  
this.index=index;            
this.current=null;

this.hasNext=function() {
 return this.ne != null;
}

this.next=function() { 
 
 var e = this.ne;
 if (e == null) 
  throw "No such Element";
   
 var n = e.next;
 var t = this.table;
 var i = this.index;
 while (n == null && i > 0)
  n = t[--i];
 this.index = i;
 this.ne = n;
 this.current=e;

 return this.current;
}
}

function HashMap()
{
this.len=8;
this.table=new Array();
this.length=0;
}
// refer to java.util.HashMap
HashMap.hash=function(x){
   var h = x.hashCode();
   h += ~(h << 9);
   h ^=  (h >>> 14);
   h +=  (h << 4);
   h ^=  (h >>> 10);
   return h;
}

HashMap.prototype.rehash=function(){       
   var oldTable = this.table;   
   this.table=new Array();
       
//transfer        
   for (var i = 0; i< oldTable.length; i++) {
       var e = oldTable[i];
       if (e != null) {
          oldTable[i] = null;
          do {
              var next = e.next;
              var j = this.indexFor(e.hash);  
              e.next = this.table[j];
              this.table[j] = e;
              e = next;
           } while (e != null);
       }
   }
}

HashMap.prototype.indexFor=function(h) {
var index= h & (this.len-1);
return index;
}

HashMap.prototype.size=function() {
return this.length;
}

HashMap.prototype.isEmpty=function() {
return this.length == 0;
}

HashMap.prototype.get=function(key) {
var hash =HashMap.hash(key);
var i = this.indexFor(hash);

var e = this.table[i]; 

while (true) {
 if (e ==null)
  return null;
 if (e.hash == hash && key.equals(e.key)) 
  return e.value;
 e = e.next;
}
}

HashMap.prototype.containsKey=function(key) {
var hash =HashMap.hash(key);
var i = this.indexFor(hash);
var e = this.table[i]; 

while (e != null) {
 if (e.hash == hash && key.equals(e.key)) 
  return true;
 e = e.next;
}
return false;
}

HashMap.prototype.put=function(key,value) {
var hash = HashMap.hash(key);
var i = this.indexFor(hash);

for (var e = this.table[i]; e != null; e = e.next) {
 if (e.hash == hash && key.equals(e.key)) {
  var oldValue = e.value;
  e.value = value;
  return oldValue;
 }
}

this.addEntry(hash, key, value, i);

var r=Math.ceil(this.length * 1.5);

if(r > this.len){
 this.len= this.len << 1;
 this.rehash();
}
return null;
}

HashMap.prototype.putAll=function (map){
var mod=false;
for(var it=map.iterator();it.hasNext();){
 var e=it.next();
 if(this.put(e.getKey(),e.getValue())) mod=true;
}
}

HashMap.prototype.remove=function(key) {
   var e = this.removeEntryForKey(key); 
   return (e ==null ? null : e.value);
}

HashMap.prototype.removeEntryForKey=function(key) {
var hash = HashMap.hash(key);
var i = this.indexFor(hash);

var prev = this.table[i];
var e = prev;

while (e != null) {
 var next = e.next;
 if (e.hash == hash && key.equals(e.key)) {
  this.length--;
  if (prev.equals(e)) 
   this.table[i] = next;
  else
   prev.next = next;
  return e;
 }
 prev = e;
 e = next;
}
return e;
}

HashMap.prototype.clear=function() {
   for (var i = 0; i < this.table.length; i++) 
       this.table[i] = null;
   this.length = 0;
}

HashMap.prototype.containsValue=function(value) {
if (value == null) return false;

var tab = this.table;
for (var i = 0; i < tab.length ; i++)
 for (var e = tab[i] ; e != null ; e = e.next)
  if (value.equals(e.value))
   return true;
return false;
}

HashMap.prototype.addEntry=function(hash, key, value, bucketIndex) {
this.table[bucketIndex] = new Entry(hash, key, value, this.table[bucketIndex]);
this.length++;
}

HashMap.prototype.iterator=function(){
var i=this.table.length;

var next=null;
while(i>0 && next==null){
 next=this.table[--i];
}

return new HashIterator(this.table,i,next);
}

HashMap.prototype.hashCode=function(){
var h=0;
for(var it=this.iterator();it.hasNext();){
 h+=it.next().hashCode();
}
return h;
}

HashMap.prototype.equals=function(map){
if(!this.typeMatches(map)) return false;
if(map.size()!=this.size()) return false;

for(var it=this.iterator();it.hasNext();){ 
 var e=it.next();
 var key=e.getKey();
 var value=e.getValue();

 if(!value.equals(map.get(key))) return false

}
return true;
}

/*************************
HashSet
**************************/

function HashSetIterator(ite){
   this.it=ite;
 
this.hasNext=function() {
 return this.it.hasNext();
   }

   this.next=function() { 
 return this.it.next().getKey();
   }
}

function HashSet(){  
this.map=new HashMap();
}
HashSet.NULL=new Number("!THIS IS NULL!");

HashSet.prototype.size=function(){
return this.map.size();
}

HashSet.prototype.isEmpty=function() {
return this.map.isEmpty();
}

HashSet.prototype.contains=function(o) {
return this.map.containsKey(o);
}

HashSet.prototype.add=function(o){
return this.map.put(o,HashSet.NULL)==null;
}

HashSet.prototype.addAll=function(set){
var mod=false;
for(var it=set.iterator();it.hasNext();){
 if(this.add(it.next())) mod=true;
}
return mod;
}

HashSet.prototype.remove=function(o) {
return this.map.remove(o).equals(HashSet.NULL);
}

HashSet.prototype.clear=function() {
this.map.clear();
}

HashSet.prototype.iterator=function(){
return new HashSetIterator(this.map.iterator());
}

HashSet.prototype.equals=function(o) {
if(!this.typeMatches(o)) return false;
if (o.size() != this.size()) return false;
for(var it=this.iterator();it.hasNext();){
 if(!o.contains(it.next())) return false;
}
return true;
}

HashSet.prototype.hashCode=function() {
var h=0;
for(var it=this.iterator();it.hasNext();){
 h+=it.next().hashCode();
}
return h;
}

HashSet.prototype.toArray=function(){
var arr=new Array();
var i=0;
for(var it=this.iterator();it.hasNext();){
 arr[i++]=it.next();
}
return arr;
}

Javascript 相关文章推荐
jQuery页面滚动浮动层智能定位实例代码
Aug 23 Javascript
select标记美化--JS式插件、后期加载
Apr 01 Javascript
javascript闭包入门示例
Apr 30 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
javascript实现用户点击数量统计
Dec 25 Javascript
MvcPager分页控件 适用于Bootstrap
Jun 03 Javascript
vue按需引入element Transfer 穿梭框
Sep 30 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 Javascript
JS实现密码框效果
Sep 10 Javascript
仿服务器端脚本方式的JS模板实现方法
Apr 27 #Javascript
改版了网上的一个js操作userdata
Apr 27 #Javascript
用 JSON 处理缓存
Apr 27 #Javascript
转一个日期输入控件,支持FF
Apr 27 #Javascript
学习jquery之一
Apr 27 #Javascript
JavaScript与函数式编程解释
Apr 27 #Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 #Javascript
You might like
php操作excel文件 基于phpexcel
2010/07/02 PHP
PHP安全技术之 实现php基本安全
2010/09/04 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
PHP单例模式详细介绍
2015/07/01 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
利用python获取Ping结果示例代码
2017/07/06 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
元旦晚会邀请函
2014/02/01 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers