当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript函数库-集合框架

Javascript
JavaScript DOM学习第八章 表单错误提示
JavaScript DOM 学习第九章 选取范围的介绍
JavaScript CSS修改学习第一章 查找位置
JavaScript CSS修改学习第二章 样式
JavaScript CSS修改学习第三章 修改样式表
JavaScript CSS 修改学习第四章 透明度设置
JavaScript CSS修改学习第五章 给“上传”添加样式
JavaScript CSS修改学习第六章 拖拽
Jquery乱码的一次解决过程 图解教程
javascript 包裹节点 提高效率
javascript inneHTML的地雷
javascript 定义新对象方法
判定对象是否为window的js代码
jquery validator 插件增加日期比较方法
jquery 得到当前页面高度和宽度的两个函数
JavaScript 编写匿名函数的几种方法
jQuery 操作下拉列表框实现代码
jQuery入门问答 整理的几个常见的初学者问题
第一个JavaScript入门基础 document.write输出
javascript入门基础之私有变量

Javascript 中的 javascript函数库-集合框架


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 33 ::
收藏到网摘: n/a

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