//: chapter 9 practice 10 : Create an int container and
// compare to ArrayList with Integer.
import java.util.*;
class intList {
private double useRate = 0.75;
private int useNum = 0;
private int size = 100;
private int[] sl1 = new int[size];
public void add(int index, int string) {
// 如果位置超出,则重建array
if(index > size) {
size = index * 2;
sl1 = reSize(sl1, size);
}
sl1[index] = string;
useNum = useNum + 1;
if(useNum / size > useRate){
size = useNum * 2;
sl1 = reSize(sl1, size);
}
}
public int add(int string) {
int index = 0;
for(int i = 0; i < sl1.length; i++) {
if(sl1[i] == 0)
sl1[i] = string;
useNum = useNum + 1;
if(useNum / size > useRate){
size = useNum * 2;
sl1 = reSize(sl1, size);
}
index = i;
}
return index;
}
public static int[] reSize(int[] a1, int size) {
int[] a2 = new int[size];
for(int i = 0; i < a1.length; i++)
a2[i] = a1[i];
a1 = new int[size];
for(int j = 0; j < a2.length; j++)
a1[j] = a2[j];
return a1;
}
public int get(int index) {
return sl1[index];
}
public int size(){
return size;
}
}
public class P10 {
private abstract static class Tester {
String name;
Tester(String name) { this.name = name; }
abstract void test(intList sl, int size, int reps);
abstract void test(ArrayList al, int size, int reps);
}
private static Tester[] tests = {
new Tester("add") {
void test(intList sl, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < size; j++)
sl.add(j, j*j);
}
void test(ArrayList al, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < size; j++)
al.add(j, new Integer(j*j));
}
},
new Tester("get") {
void test(intList sl, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < size; j++)
sl.get(j);
}
void test(ArrayList al, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < size; j++)
al.get(j);
}
},
// ‘Increamenting that’s reset the value of the very
// position of the container.
new Tester("self add") {
void test(intList sl, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < size; j++)
sl.add(j,sl.get(j)+1);
}
void test(ArrayList al, int size, int reps) {
for(int i = 0; i < reps; i++)
for(int j = 0; j < reps; j++)
al.add(j, new Integer(((Integer)al.get(j)).intValue()+1));
}
}
};
public static void test(intList sl, int size, int reps) {
System.out.println("Testing " + sl.getClass().getName() + " size " + size);
for(int i = 0; i < tests.length; i++) {
System.out.print(tests[i].name);
long t1 = System.currentTimeMillis();
tests[i].test(sl,size,reps);
long t2 = System.currentTimeMillis();
System.out.println(": " + (double)(t2 – t1)/(double)size);
}
}
public static void test(ArrayList al, int size, int reps) {
System.out.println("Testing " + al.getClass().getName() + " size " + size);
for(int i = 0; i < tests.length; i++) {
System.out.print(tests[i].name);
long t1 = System.currentTimeMillis();
tests[i].test(al,size,reps);
long t2 = System.currentTimeMillis();
System.out.println(": " + (double)(t2 – t1)/(double)size);
}
}
public static void main(String[] args) {
int reps = 1000;
if(args.length > 0)
reps = Integer.parseInt(args[0]);
// small size:
test(new intList(), 10, reps);
test(new ArrayList(), 10, reps);
// middle size:
test(new intList(), 100, reps);
test(new ArrayList(), 100, reps);
// lardge size:
test(new intList(), 1000, reps);
test(new ArrayList(), 1000, reps);
}
}