/** * 本章目标: * 1.自制数组类 * 2.有序数组:按关键字升降序排列;二分法查找 * 3.分析有序数组。大O表示法 */ /** * 自制数组类 书中有的地方有错误,本程序以修改 */ class HighArray { private long[] a; private int nElements;// 维护array的实际元素个数 public HighArray(int size) { a = new long[size]; nElements = 0;// 初始化的时候个数设为0 } /** * toString()把数组转为字符串,方便打印 */ public String toString() { if (nElements == 0) return "[]";// 若数组元素个数为0,直接返回[]即可 StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < nElements; i++) { sb.append(a[i] + ","); } sb.deleteCharAt(sb.length() - 1); sb.append("]"); return sb.toString(); } /** * 打印数组 */ public void display() { System.out.println(toString()); } /** * 插入value * * @param value */ public void insert(long value) { if (nElements >= a.length) {// 数组已满 System.out.println("array is full."); return; } // 未满则进行插入,个数加一 a[nElements] = value; nElements++; } /** * 删除value * * @param value * @return */ public boolean delete(long value) { if (nElements == 0) {// 数组为空 System.out.println("array is empty..."); return false; } // 找到要删除的元素索引j int j; for (j = 0; j < nElements; j++) { if (value == a[j]) break; } // 数组中不含value元素 if (j == nElements) return false; //若有value元素,则从该元素位置开始到倒数第二个元素,每个元素被其后一个替换, //即后面的元素往前移动一个位置。此处中文版边界有错误 else { for (int k = j; k < nElements - 1; k++) { a[k] = a[k + 1]; } nElements--; return true; } } /** * 数组中是否包含元素key * * @param key * @return */ public boolean find(long key) { int j; for (j = 0; j < nElements; j++) if (a[j] == key) break; if (j == nElements) return false; else return true; } /** * 数组元素个数 * * @return */ public int size() { return nElements; } } public class ArrayDemo { public static void main(String[] args) { HighArray la = new HighArray(10); int[] a = { 1, 3, 3, 4, 2, 6, 7, 9, 8, 12, 33 }; for (int i = 0; i < a.length; i++) { la.insert(a[i]); la.display(); } // System.out.println(la.find(3322)); // for(int i = 0;i<a.length;i++){ // la.delete(a[i]); // la.display(); // } // la.delete(3); la.delete(3); la.display(); } }