1 /**********************************************************
2 * JavaScript实现的ArrayList类
3 *
4 * @author {yangl}
5 * @version $Revision: 0.5 $ $Date: 2008/04/02 15:00:00 $
6 * @description
7 * Method:
8 * add(element);
9 * addElementAt(index, element);
10 * contains(element);
11 * get(index);
12 * isEmpty(index);
13 * indexOf(element);
14 * lastIndexOf(element);
15 * remove()
16 * setElementAt(index, element);
17 * size();
18 * toString();
19 * @example
20 * var arrList = new ArrayList();
21 * //var arrList = new ArrayList(10);
22 * arrList.add("000");
23 * arrList.add("001");
24 * arrList.add("002");
25 *
26 *********************************************************/
27 // JavaScript ArrayList
28 /**//**
29 Method:
30 add(element);
31 addElementAt(index, element);
32 contains(element);
33 get(index);
34 isEmpty(index);
35 indexOf(element);
36 lastIndexOf(element);
37 remove(index);
38 setElementAt(index, element);
39 size();
40 toString();
41 */
42 /**//**
43 Example:
44 var arrList = new ArrayList();
45 //var arrList = new ArrayList(10);
46 arrList.add("000");
47 arrList.add("001");
48 arrList.add("002");
49 */
50 var ArrayList = function() {
51 var args = ArrayList.arguments;
52 var initialCapacity = 10;
53
54 if (args != null && args.length > 0) {
55 initialCapacity = args[0];
56 }
57
58 var elementData = new Array(initialCapacity);
59 var elementCount = 0;
60
61 this.size = function() {
62 return elementCount;
63 };
64
65 this.add = function(element) {
66 //alert("add");
67 ensureCapacity(elementCount + 1);
68 elementData[elementCount++] = element;
69 return true;
70 };
71
72 this.addElementAt = function(index, element) {
73 //alert("addElementAt");
74 if (index > elementCount || index < 0) {
75 alert("IndexOutOfBoundsException, Index: " + index + ", Size: " + elementCount);
76 return;
77 //throw (new Error(-1,"IndexOutOfBoundsException, Index: "+index+", Size: " + elementCount));
78 }
79 ensureCapacity(elementCount + 1);
80 for (var i = elementCount + 1; i > index; i--) {
81 elementData[i] = elementData[i - 1];
82 }
83 elementData[index] = element;
84 elementCount++;
85 };
86
87 this.setElementAt = function(index, element) {
88 //alert("setElementAt");
89 if (index > elementCount || index < 0) {
90 alert("IndexOutOfBoundsException, Index: " + index + ", Size: " + elementCount);
91 return;
92 //throw (new Error(-1,"IndexOutOfBoundsException, Index: "+index+", Size: " + elementCount));
93 }
94 elementData[index] = element;
95 };
96
97 this.toString = function() {
98 //alert("toString()");
99 var str = "{";
100 for (var i = 0; i < elementCount; i++) {
101 if (i > 0) {
102 str += ",";
103 }
104 str += elementData[i];
105 }
106 str += "}";
107 return str;
108 };
109
110 this.get = function(index) {
111 //alert("elementAt");
112 if (index >= elementCount) {
113 alert("ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount);
114 return;
115 //throw ( new Error( -1,"ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount ) );
116 }
117 return elementData[index];
118 };
119
120 this.remove = function(index) {
121 if (index >= elementCount) {
122 alert("ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount);
123 //return;
124 throw (new Error(-1, "ArrayIndexOutOfBoundsException, " + index + " >= " + elementCount));
125 }
126 var oldData = elementData[index];
127 for (var i = index; i < elementCount - 1; i++) {
128 elementData[i] = elementData[i + 1];
129 }
130 elementData[elementCount - 1] = null;
131 elementCount--;
132 return oldData;
133 };
134
135 this.isEmpty = function() {
136 return elementCount == 0;
137 };
138
139 this.indexOf = function(elem) {
140 //alert("indexOf");
141 for (var i = 0; i < elementCount; i++) {
142 if (elementData[i] == elem) {
143 return i;
144 }
145 }
146 return -1;
147 };
148
149 this.lastIndexOf = function(elem) {
150 for (var i = elementCount - 1; i >= 0; i--) {
151 if (elementData[i] == elem) {
152 return i;
153 }
154 }
155 return -1;
156 };
157
158 this.contains = function(elem) {
159 return this.indexOf(elem) >= 0;
160 };
161
162 function ensureCapacity(minCapacity) {
163 var oldCapacity = elementData.length;
164 if (minCapacity > oldCapacity) {
165 var oldData = elementData;
166 var newCapacity = parseInt((oldCapacity * 3) / 2 + 1);
167 if (newCapacity < minCapacity) {
168 newCapacity = minCapacity;
169 }
170 elementData = new Array(newCapacity);
171 for (var i = 0; i < oldCapacity; i++) {
172 elementData[i] = oldData[i];
173 }
174 }
175 }
176 };