js中实现ArraryList

/**********************************************************
  * 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];
            }
        }
    }
};
原文地址:https://www.cnblogs.com/kinpauln/p/2614938.html