课时69:案例分析四(数组操作)
01. 数组操作定义
建立一个可以实现整型数组的操作类(Aray),而后在里面可以操作的数组的大小由外部来决定,而后在 Amay 类里面需要提供有数组的如下处理:进行数据的增加(如果数据满了则无法增加)、可以实现数组的容量扩充、取得数组全部内容。
完成之后在此基础上再派生出两个子类:
(1) 数组排序类:返回的数据必须是排序后的结果;
(2) 数组反转类:可以实现内容的首尾交换。
02. 数组操作步骤
对于本程序而言首先要考虑的一定都是父类如何定义完善。
第一步:实现基本的数组操作类定义
第二步:进行排序子类定义
第三步:定义反转子类
2.1 实现基本的数组操作类定义
class Array { // 数组的操作类 private int [] data ; //整型数组 public Array(int len) { if (len > 0) { this. data = new int [len] ; //开辟数组 } else { this. data =new int[1];//开辟一个空间 } }
这里要求追加一个数据满了无法增加,无法增加的话可以在下面这样写:
public Boolean add(int num) { // 数据增加
数据增加的话,数组中的的数据是一块一块存的,所以整型数据下面需要一个角标控制,所以整型数据下应该如下列所示:
private int foot ;// 进行数组索引控制
这个地方写完之后,在数据增加下方接着写:
If (this. foot< this. data. length) { //有位置 this, data [this. foot ++] = this. data ; return true ; } return false ; } public int[] getData() { return this. data ; } } public int[] getData () { return this. data ; } } public class JavaDemo { public static void main(string args[ ]) { Array arr =new Array(5); System.out.println(arr.add(10)); System.out.println(arr.add(5)); System.out.println(arr.add(20)); System.out.println(arr.add(3)); System.out.println(arr.add(6)); System.out.println(arr.add(1));
现在编译代码,发现有一处错误,这时将
this, data [this. foot ++] = this. data ;
改成
this, data [this. foot ++] =num ;
此时再将代码编译执行,如图:
除此之外,案例上说可以实现数组的容量扩充,那么在this. data =new int[1];后面继续编写:
public void increment(int num) { //实现数组的容量扩充,给出的是扩充大小,实际大小:已有大小+扩充大小。
因为数组的最大特征在于长度是固定的,这也是数组的最大缺陷所在,所以要想扩充,只能再产生个new数组,如下:
int newData []= new int [this.data.length + num];
这里需要把原始数组进行拷贝,如下:
System. arraycopy (this.data,0,newData,0,this.data.length);
this. data=newData ;//改变数组引用
再将上列数组扩充一个三,如下:
System.out.println(arr.add(10)); System.out.println(arr.add(5)); System.out.println(arr.add(20)); System.out.println(arr.add(3)); System.out.println(arr.add(6)); arr.increment(3); System.out.println(arr.add(1));
再将代码进行编译,如图所示:
到这里,一个数组位就正常完成了。
2.2 进行排序子类定义
定义排序子类;
排序子类在原数组上继续添加代码如下:
class SortArray extends Array { //定义排序子类
构造方法需要明确有参构造,这里需继续跟上
public SortArray(int len) { super(len); } public int[] getData( ) { //获得排序结果 java.util. Arrays.sort(super.getData()) ; //排序 return super.getData();
现在遵循的是父类中的方法要求,所以只需要在上方数组代码中改位即可,如下所示:
将 Array arr =new Array(5);
改为SortArray arr=new SortArray(5)
System.out.println(arr.add(10)); System.out.println(arr.add(5)); System.out.println(arr.add(20)); System.out.println(arr.add(3)); System.out.println(arr.add(6)); arr.increment(3); System.out.println(arr.add(1)); System.out.println(arr.add(7)); System.out.println(arr.add(0)); int result []= arr.getData(); for (int temp :result) { System.out.print(temp+”、”); }
再一次进行编译执行,如图:
2.3 定义反转子类
整个代码现在的操作就是以父类为标准,在整个定义的时候,子类中父类有什么方法就继续什么方法。
class ReverseArray extends Array { //定义反转子类 public ReverseArray (int len) { super(len); } public int[] getData() { //获得排序结果 int center=super.getData().length/2; int head=0; int tail=super.getDat().length-1; for(int x=0;x<center ;x++) { int temp= super.getData()[head] super.getData()[head]=super.getData()[tail] super.getData()[tai1]=temp head ++ tail-- } return super.getData();
再将数组子类更改,如下所示:
将 SortArray arr=new SortArray(5)
改为ReverseArray arr=new ReverseArray(5);
然后再次编译执行,如下图:
父类之中定义的方法名称往往都很重要,如果功能相同的时候子类应该以覆写父类的方法为优先考虑。