分享
 
 
 

javascript函数库:集合框架

王朝html/css/js·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

/**

collection.js

version 1.2

author treeroot

since 2005-5-24

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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有