通用程序设计(1)---通用包

    技术2022-05-11  8

    package ceun.collections;

    /** * 一个子ArrayBag对象是Object的指针构成的集合 * 可以往包中加入任意类型的对象 */public class ArrayBag implements Cloneable { /**  * 存储包的元素  */ private Object[] data;

     /**  * 存储包元素的数目  */ private int manyItem;

     /**  * 初始化空包,初始容量为10。注意,只要没有达到容量的上限, add方法就能有效地执行(不需要额外的内存)。  *   * @postcondition 包是空的,初始容量是10  * @exception OutOfMemoryError  *                表明没有足够的内存用于生成新的Object[10]  */ public ArrayBag() {  final int INITIAL_CAPACITY = 10;  data = new Object[INITIAL_CAPACITY];  manyItem = 0; }

     /**  * 用指定的初始容量来初始化空包。注意,只要没有达到容量的上限, add方法就能有效地执行(不需要额外的内存)。  *   * @param initialCapacity  *            包的初始容量  * @precondition initialCapacity是非负数。  * @postcondition 生成空包,容量为给定的初始量。  * @exception IllegalArgumentException  * @exception OutOfMemoryError  *                表明没有足够的内存用于生成新的Object[initialCapacity]  */ public ArrayBag(int initialCapacity) {  if (initialCapacity < 0)   throw new IllegalArgumentException("initialCapacity不能小于0");  data = new Object[initialCapacity];  manyItem = 0; }

     /**  * 将某个对象的指针放入包中。如果新增的对象指针会使得包超出当前的容量, 那么在增加新元素前增加容量。新元素可以是null指针。  *   * @param element  *            增加到包中的元素。  * @postcondition 指定对象的指针被增加到了包中。  * @exception OutOfMemoryError  *                表明没有足够的内存  */ public void add(Object element) {  if (manyItem == data.length)   ensureCapacity(manyItem * 2 + 1);  data[manyItem] = element;  manyItem++; }

     /**  * 增加另一个包中的内容到当前包中。  *   * @param append  *            一个包,它的内容将被增加到当前包中。  * @precondition append不为空  * @postcondition 将append中的元素增加到了当前包中。  * @exception NullPointerExceptionb  *                表明append为空  * @exception OutOfMemoryError  *                表明没有足够的内存空间来增加包的大小。  */ public void addAll(ArrayBag append) {  ensureCapacity(manyItem + append.manyItem);  System.arraycopy(append.data, 0, data, manyItem, append.manyItem);  manyItem += append.manyItem; }

     /**  * 生成包含其他两个包的所有元素的新包。  *   * @param b1  *            包一  * @param b2  *            包二  * @precondition b1和b2 都不为null  * @exception NullPointerException  *                表明某个参数为null OutOfMemoryError 表明没有足够的内存空间用于创建新包。  */ public static ArrayBag union(ArrayBag b1, ArrayBag b2) {  ArrayBag answer = new ArrayBag(b1.getCapacity() + b2.getCapacity());  System.arraycopy(b1.data, 0, answer.data, 0, b1.manyItem);  System.arraycopy(b2.data, 0, answer.data, b1.manyItem, b2.manyItem);  answer.manyItem = b1.manyItem + b2.manyItem;  return answer; }

     /**  * 用于统计包中某个特定元素出现次数的存取方法。  *   * @param target  *            将被统计的Object的指针。  * @return 返回 target在包中出现的次数。如果target 不为null,那么将使用target.equals方法来统计次数。  */ public int countOccurrences(Object target) {  int answer;  int index;  answer = 0;  if (target == null) {   // 统计包中null出现的次数]   for (index = 0; index < manyItem; index++)    if (data[index] == null)     answer++;  } else {   // 使用target.equals来确定target出现的次数   for (index = 0; index < manyItem; index++)    if (target.equals(data[index]))     answer++;  }  return answer; }

     /**  * 从包中删除某个指定元素的副本。  *   * @param target  *            将从包中移除的某个元素。  * @postcondition 如果在包中找到了target,那么移除该target的一个副本,并且方法返回true,  *                否则包保持不变,方法返回false。注意,如果target不为null,那么使用target.equals方法  *                在包中查找。  */ public boolean remove(Object target) {  int index;// target在data数组中的位置  if (target == null) {   // 找到包中null指针在包中首次出现   index = 0;   while ((index < manyItem) && (data[index] != null))    index++;  } else {   index = 0;   while ((index < manyItem) && (!target.equals(data[index])))    index++;  }  if (index == manyItem)   return false;  else {   manyItem--;   data[index] = data[manyItem];// 将最后一个元素移到index位置   data[manyItem] = null;   return true;  } }

     /**  * 确保包有足够的容量  */ public void ensureCapacity(int minimumCapacity) {  Object[] newData;  if (minimumCapacity > data.length) {   newData = new Object[minimumCapacity];   System.arraycopy(data, 0, newData, 0, manyItem);   data = newData;  } }

     /**  * 获得包的容量  */ public int getCapacity() {  return data.length; }

     /**  * 将包的当前容量减小到与它的当前的大小(即包含的元素个数)相等。  *   * @postcondition 包的容量变成与它的当前大小相同。  * @exception OutOfMemoryError  *                表明没有足够的内存用于容量改变。  */ public void trimToSize() {  Object[] trimmedArray;

      if (data.length != manyItem) {   trimmedArray = new Object[manyItem];   System.arraycopy(data, 0, trimmedArray, 0, manyItem);   data = trimmedArray;  } }

     /**  * 获得包的当前大小  *   * @return 返回包的当前大小  */ public int size() {  return this.manyItem; }

     /**  * 克隆当前包  */ public Object clone() {  ArrayBag newBag = null;  try {   newBag = (ArrayBag) super.clone();  } catch (CloneNotSupportedException e) {   throw new RuntimeException(     "This class does not implement Cloneable");  }  newBag.data = (Object[]) data.clone();  return newBag; }

     /**     * 从包中检索某个随机元素的存取方法     * @precondition     *  包不为空     * @return     * 返回从包中任意选定的元素     * @exception  IllegalStateException     * 表明包是空的     * */ public Object grab(){  int i;  if(manyItem==0)   throw new IllegalStateException("包是空的");  i=(int)(Math.random()*manyItem);  return data[i]; }

    /**  * 打印包的元素  */ public void printData() {  for (int i = 0; i < manyItem; i++)   System.out.println(data[i]); }}-------------------------------------

    测试包

    _____________

    package ceun.test;

    import ceun.collections.ArrayBag;import junit.framework.TestCase;

    public class TestArrayBag extends TestCase {

     protected void setUp() throws Exception {  System.out.println("setUp()**********************"); }

     protected void tearDown() throws Exception {  System.out.println("tearDown()/n**********************"); }

     /*  * “ceun.collections.ArrayBag.add(Object)”的测试方法  */ public void testAdd() {  System.out.println("testAdd");  ArrayBag b = new ArrayBag();  b.add(new String("Hello ceun!"));  b.add(new Integer(10));  b.add("Good ok");  b.printData(); }

     /*  * “ceun.collections.ArrayBag.addAll(ArrayBag)”的测试方法  */ public void testAddAll() {  System.out.println("testAddAll()");  ArrayBag b1 = new ArrayBag(3);  b1.add(new String("Hello ceun!"));  b1.add(new Integer(10));  b1.add("Good ok");  b1.printData();  System.out.println("--------------------");  ArrayBag b2=new ArrayBag(2);  b2.add("我们");  b2.add("来了");  b2.printData();  System.out.println("--------------------");  b1.addAll(b2);  b1.printData(); }

     /*  * “ceun.collections.ArrayBag.union(ArrayBag, ArrayBag)”的测试方法  */ public void testUnion() {  System.out.println("testAddUnion()");  ArrayBag b1 = new ArrayBag(3);  b1.add(new String("Hello ceun!"));  b1.add(new Integer(10));  b1.add("Good ok");  b1.printData();  System.out.println("--------------------");  ArrayBag b2=new ArrayBag(2);  b2.add("我们");  b2.add("来了");  b2.printData();  System.out.println("union--------------------");  ArrayBag b=ArrayBag.union(b1,b2);  b.printData(); }

     /*  * “ceun.collections.ArrayBag.countOccurrences(Object)”的测试方法  */ public void testCountOccurrences() {  System.out.println("testCountOccurrences()-----");  ArrayBag b = new ArrayBag();  b.add(new String("Hello ceun!"));  b.add(new Integer(10));  b.add(null);  b.add("Good ok");  b.add(null);  b.add(null);  b.add(new Integer(10));  b.add("Good ok");  b.printData();  System.out.println("null出现次数"+b.countOccurrences(null)); }

     /*  * “ceun.collections.ArrayBag.remove(Object)”的测试方法  */ public void testRemove() {  System.out.println("testRemove()-----");  ArrayBag b = new ArrayBag();  b.add(new String("Hello ceun!"));  b.add(new Integer(10));  b.add(null);  b.add("Good ok");  b.add(null);  b.add(null);  b.add(new Integer(10));  b.add("Good ok");  b.printData();  b.remove(null);  System.out.println("remove--------------------");  b.printData(); }

     /*  * “ceun.collections.ArrayBag.trimToSize()”的测试方法  */ public void testTrimToSize() {  System.out.println("testTrimToSize()-----");  ArrayBag b = new ArrayBag();  System.out.println("原容量"+b.getCapacity());  b.add(new String("Hello ceun!"));  b.add(new Integer(10));  b.add(null);  b.add("Good ok");  b.add(null);  b.add(null);  b.add(new Integer(10));  b.printData();  b.trimToSize();  System.out.println("后容量"+b.getCapacity());  b.printData(); }

     /*  * “ceun.collections.ArrayBag.clone()”的测试方法  */ public void testClone() {  System.out.println("testClone()-----");  ArrayBag b = new ArrayBag();  b.add(new String("Hello ceun!"));  b.add(new Integer(10));  b.add(null);  b.add("Good ok");  b.add(null);  b.add(new Integer(10));  b.printData();  ArrayBag cb =(ArrayBag)b.clone();  cb.add("Copy ok");  System.out.println("copy--------------------");  cb.printData();  System.out.println("b--------------------");  b.printData(); }

    }


    最新回复(0)