Js中にAraryListを実現
13143 ワード
/**********************************************************
* JavaScript ArrayList
*
* @author {yangl}
* @version $Revision: 0.5 $ $Date: 8/04/15:00:$
* @description
* Method:
* add(element);
* addElementAt(index, element);
* contains(element);
* get(index);
* isEmpty(index);
* indexOf(element);
* lastIndexOf(element);
* remove()
* setElementAt(index, element);
* size();
* toString();
* toArray();
* @example
* var arrList = new ArrayList();
* //var arrList = new ArrayList(10);
* arrList.add("");
* arrList.add("");
* arrList.add("");
*
*********************************************************/
// JavaScript ArrayList
/**
Method:
add(element);
addElementAt(index, element);
contains(element);
get(index);
isEmpty(index);
indexOf(element);
lastIndexOf(element);
remove(index);
setElementAt(index, element);
size();
toString();
*/
/**
Example:
var arrList = new ArrayList();
//var arrList = new ArrayList(10);
arrList.add("");
arrList.add("");
arrList.add("");
*/
var ArrayList = function () {
var args = ArrayList.arguments;
var initialCapacity = 10;
if (args != null && args.length > 0) {
initialCapacity = args[0];
}
var elementData = new Array(initialCapacity);
var elementCount = 0;
this.size = function () {
return elementCount;
};
this.add = function (element) {
//alert("add");
ensureCapacity(elementCount + 1);
elementData[elementCount++] = element;
return true;
};
this.addElementAt = function (index, element) {
//alert("addElementAt");
if (index > elementCount || index < 0) {
alert("IndexOutOfBoundsException, Index: " + index + ", Size: " + elementCount);
return;
//throw (new Error(-1,"IndexOutOfBoundsException, Index: "+index+", Size: " + elementCount));
}
ensureCapacity(elementCount + 1);
for (var i = elementCount + 1; i > index; i--) {
elementData[i] = elementData[i - 1];
}
elementData[index] = element;
elementCount++;
};
this.setElementAt = function (index, element) {
//alert("setElementAt");
if (index > elementCount || index < 0) {
alert("IndexOutOfBoundsException, Index: " + index + ", Size: " + elementCount);
return;
//throw (new Error(-1,"IndexOutOfBoundsException, Index: "+index+", Size: " + elementCount));
}
elementData[index] = element;
};
this.toString = function () {
//alert("toString()");
var str = "{";
for (var i = 0; i < elementCount; i++) {
if (i > 0) {
str += ",";
}
str += elementData[i];
}
str += "}";
return str;
};
this.get = function (index) {
//alert("elementAt");
if (index >= elementCount) {
alert("ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount);
return;
//throw ( new Error( -1,"ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount ) );
}
return elementData[index];
};
this.remove = function (index) {
if (index >= elementCount) {
alert("ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount);
//return;
throw (new Error(-1, "ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount));
}
var oldData = elementData[index];
for (var i = index; i < elementCount - 1; i++) {
elementData[i] = elementData[i + 1];
}
elementData[elementCount - 1] = null;
elementCount--;
return oldData;
};
this.isEmpty = function () {
return elementCount == 0;
};
this.indexOf = function (elem) {
//alert("indexOf");
for (var i = 0; i < elementCount; i++) {
if (elementData[i] == elem) {
return i;
}
}
return -1;
};
this.lastIndexOf = function (elem) {
for (var i = elementCount - 1; i >= 0; i--) {
if (elementData[i] == elem) {
return i;
}
}
return -1;
};
this.contains = function (elem) {
return this.indexOf(elem) >= 0;
};
this.toArray = function () {
var resultArray = new Array(this.size());
for (var i = 0; i < this.size(); i++) {
resultArray[i] = elementData[i];
}
return resultArray;
};
function ensureCapacity(minCapacity) {
var oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
var oldData = elementData;
var newCapacity = parseInt((oldCapacity * 3) / 2 + 1);
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
elementData = new Array(newCapacity);
for (var i = 0; i < oldCapacity; i++) {
elementData[i] = oldData[i];
}
}
}
};