javascript函数库-集合框架

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;
}

(0)

相关推荐

  • 一道Java集合框架题 多种解题思路

    问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出. 要求:分别用List.Map.Set来实现,打印的信息包括学号.姓名和成绩. 1.使用List集合来实现 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; impor

  • Java集合框架ArrayList源码分析(一)

    ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于列表的大小.随着向 ArrayList 中不断添加元素,其容量也自动增长. ArrayList不是同步的(也就是说不是线程安全的),如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步,在多线程环境下,可以使用Collections.synchronizedList方法声明一个线程安全的ArrayList

  • 关于Java集合框架面试题(含答案)上

    1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类. (2)随着使用经过严格测试的集合框架类,代

  • java集合框架的体系结构详细说明

    最近在一本J2EE的书中看到了很不错的对集合框架的说明文章,筛选后发上来和大家共享,集合框架提供管理对象集合的接口和类.它包含接口,类,算法,以下是它的各个组件的说明. Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自

  • 关于Java集合框架的总结

    本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理.从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类型. 一.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). 当我们把一个对象放入集合中后,系统会把所

  • java集合框架 arrayblockingqueue应用分析

    Queue ------------ 1.ArrayDeque, (数组双端队列) 2.PriorityQueue, (优先级队列) 3.ConcurrentLinkedQueue, (基于链表的并发队列) 4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口) 5.ArrayBlockingQueue, (基于数组的并发阻塞队列) 6.LinkedBlockingQueue, (基于链表的FIFO阻塞队列) 7.LinkedBlockingDeque, (

  • 深入剖析java中的集合框架

    解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合完全弥补了数组的缺陷. 02.集合框架的内容 集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法 01.接口:表示集合的抽象数据类型 02.实现:集合框架中接口的具体实现 03.算法:在一个实现了某个集合框架的接口的对象身上完成某种有用的计算方法 java集合框架简图: 01.Collection接口存在储存一组

  • 详谈java集合框架

    1.为什么使用集合框架 当我们并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象--可以使用Java集合框架 2.Java集合框架包含的内容 接口:(父类)Collection接口下包含List(子类 )接口和Set(子类) 接口 List接口下又包含(ArrayList集合实现类和LinkedList集合实现类) Set接口下又包含(HashSet集合实现类和TreeSet集合实现类) 接口:(父类)Map接口下包含(HashMap集合实现类和TreeMap 集合实现类) *Coll

  • 关于Java集合框架面试题(含答案)下

    21.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的,而HashMap不是.所以HashMap适合单线程环境,HashTable适合多线程环境. (3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的. (4)HashMap

  • javascript函数库-集合框架

    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=

  • 初步认识JavaScript函数库jQuery

    jQuery 库可以通过一行简单的标记被添加到网页中. jQuery 库 - 特性 jQuery 是一个 JavaScript 函数库. jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScript 特效和动画 HTML DOM 遍历和修改 AJAX Utilities 向您的页面添加 jQuery 库 jQuery 库位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数. 可以通过下面的标记把 jQuer

  • asp制作中常用到的函数库集合第1/8页

    ASP函数库    <%    '''' 函数目录 ''''    ''''-----------------------------------------------''''    '''' 函数ID:0001[截字符串] ''''    '''' 函数ID:0002[过滤html] ''''    '''' 函数ID:0003[打开任意数据表并显示表结构及内容]''''    '''' 函数ID:0004[读取两种路径] ''''    '''' 函数ID:0005[测试某个文件存在否] 

  • js 通用javascript函数库整理

    复制代码 代码如下: /* * 包含jquery-1.3.2.min.js */ document.write("<script language='javascript' src='js/jquery-1.3.2.min.js'></script>"); /* * 公共参数 */ var hostUrl='http://'+window.location.host; //获取网站主机头 /* * 水平居中left值 */ function HorCenter(

  • 通用javascript脚本函数库 方便开发

    将下面代码保存为Common.js 类库功能: 1.Trim(str)--去除字符串两边的空格 2.XMLEncode(str)--对字符串进行XML编码 3.ShowLabel(str,str)--鼠标提示功能(显示字符,提示字符) 可以设置显示的提示的文字的字体.颜色.大小以及提示的背景颜色.边框等 4.IsEmpty(obj)--验证输入框是否为空 5.IsInt(objStr,sign,zero)--验证是否为整数,正整数,负整数,以及是否包括零 6.IsFloat(objStr,sig

  • JavaScript 常用函数库详解

    为此,收集了自己平时常用到一些JavaScript函数,它们在其它的JS库也常见,现在整理并附上注释,方便查阅,希望对大家有所帮助.注:假设以下所有函数都放在一个CC对象中,方便引用. 复制代码 代码如下: //这个方法相信是最常用的了, //它虽然没有选择器那么强大,但也有个小增强版,可查指定结点下ID所在的子元素 function $(id, p) { //id是否是字符串,还是一个HTML结点 var iss = id instanceof String || typeof id == "

  • 完美解决jQuery符号$与其他javascript 库、框架冲突的问题

    目前有大量的 javascript 开发框架,其中有一部分使用 $ 作为调用符号,这可能导致相互之间的冲突,而 jQuery 为解决这个问题,可以在 jQuery 导入时放弃 $ 使用权,届时 $ 则由其它框架使用,这样可以避免相同名字的函数调用不再冲突. jQuery 使用 noConflict 方法来放弃 $ 调用时的命名,之后由 jQuery 代替 $ 进行编写. 例如:alert($('#message').val()); 必须修改为 alert(jQuery('#message').v

  • JavaScript常用工具函数库汇总

    对象或数组的深拷贝 /** * 对象或数组的深拷贝 * @param {*} cloneObj 被克隆的对象 * @param {*} targetObj 克隆的目标对象 * @param {*} isOverride 若属性重复,是否覆盖被克隆对象的属性 */ function deepClone(cloneObj, targetObj, isOverride = true) { const _toString = Object.prototype.toString if (_toString

  • JavaScript的Backbone.js框架入门学习指引

    1.简介 最近在做一个大型网上银行项目前端的优化,需要使用一个胖客户端的优化,大概思路就是前端通过Ajax 请求去后端获取数据,以Jason的格式返回,然后显示在页面上.由于这个系统非常庞大,胖客户端方案难免需要在客户端写大量的JS代码.我想对于任何团队来说,大量的,非结构化的代码维护起来都非常的不方便.所以BackBone进入了我的视线. 它提供了一种途径可以让你结构化你的JS代码,让你以面向对象的方式来组织你的前端JS代码.这就好比我们在前端应用Domain Driven Design. 我

  • JavaScript函数详解

    简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作为返回值,就需要通过函数指针(function pointer).代理(delegate)等特殊的方式周折一番. 而在JavaScript世界中函数却是一等公民,它不仅拥有一切传统函数的使用方式(声明和调用),而且可以做到像简单值一样赋值.传参.返回,这样的函数也称之为第一级函数(First-cla

随机推荐