Java基础知识回顾之自定义数组

Java基础知识回顾之数组简介
Java基础知识回顾之数组与方法参数的传递
Java基础知识回顾之自定义数组

说明

了解大致数组的相关操作之后,我们可以尝试自己实现一个数组类,能够具有常用的数组功能。

需求说明

要求定义一个数组操作类(Array类),在这个类里面可以进行整形数组的操作,由外部传入数组的大小来确定数组的长度,并且要求实现数据的保存以及数据的输出。

并且能有两个派生子类:

  1. 排序类:通过此类取得的数据可以进行排序;
  2. 反转类:通过此类取得的数组数据要求采用倒序的方式输出。

需求拆分

需要定义的类:

按照需求说名,我们需要一个父类(Array类),以及两个子类:排序类(SortArray类) 和 反转类(ReverseArray类)

需要具有的功能:
父类:能接受、保存整形的数据;外部传入数组的长度;能按照数组格式输出。
排序类:对数据进行排序。
反转类:对数据进行倒叙输出。

父类实现

class Array {
	private int data[]; // 定义一个数组,用于保存传入数组的数据
	// 表示数组操作的下标,由于我们需要知道当前操作的是哪个下标,保证不会数组越界
	private int index;

	public Array(int length) { // 构造器,接受传入的数组长度
		if (length == 0) {
			this.data = new int[1]; // 当长度为0 的时候,保证能有一个元素存入
		} else {
			this.data = new int[length];// 根据传入的长度初始化
		}
	}

	/**
	 * 增加数组元素
	 * @param num
	 * @return
	 */
	public boolean add(int num) {
		if( this.index < this.data.length ) {	// 防止数组下标越界
			this.data[index] = num;
			
			index++;	// 保存完数据之后,下标增加
			return true;
		}
		return false;
	}
	
	public int[] getData(){
		return this.data;	// 获取数据
	}

}

public class TestDemo {
	public static void main(String[] args) {
		Array arr = new Array(3);
		System.out.println(arr.add(1));
		System.out.println(arr.add(2));
		System.out.println(arr.add(3));
		System.out.println(arr.add(100));
		int temp[] = arr.getData();
		for (int x = 0; x < temp.length; x++) {
			System.out.println(temp[x]);
		}

	}
}

控制台结果:
可以看到,当添加第四个元素的时候,就添加不进去了。

true
true
true
false
1
2
3

排序类实现

import java.util.Arrays;

//定义一个排序数组子类
class SortArray extends Array{

	// Array类里面现在没有无参构造的方法
	public SortArray(int length) {
		// 通过 super 调用,可以初始化出父类的 data数据
		super(length);	// 调用父类的有参构造方法
	}
	
	// 这里我们方法的重载,来保持和父类中的获取方法一致
	public int[] getData() {
		Arrays.sort(super.getData());
		return super.getData();
	}
	
}

public class TestDemo {
	public static void main(String[] args) {
		SortArray arr = new SortArray(3);
		arr.add(1);
		arr.add(8);
		arr.add(5);
		
		int temp[] = arr.getData();
		for (int x = 0; x < temp.length; x++) {
			System.out.println(temp[x]);	//1 	5	8
		}
	}
}

反转类实现

// 定义一个反转类
class ReverseArray extends Array {

	public ReverseArray(int length) {
		super(length);
	}
	
	// 反转数据的逻辑,同样是保持和父类一样的方法名称,使用方法的重载实现
	public int[] getData() {// 需要得到的是反转数据
		
		int center = super.getData().length / 2;	// 获取数组的中间长度值
		int head = 0;								// 用于计算统计从头开始的数组值
		int tail = super.getData().length - 1;		// 由于数组的下标为0,减一 是为了从后开始计算
		for (int x = 0; x < center; x++) {
			int temp = super.getData()[head];
			super.getData()[head] = super.getData()[tail];
			super.getData()[tail] = temp;
			head++;
			tail--;
		}
		return super.getData();
	}
}

public class TestDemo {
	public static void main(String[] args) {
		ReverseArray arr = new ReverseArray(3);	// Array arr = new ReverseArray(3); 也可以通过向下转型的方式实现
		arr.add(1);
		arr.add(8);
		arr.add(5);
		
		int temp[] = arr.getData();
		for (int x = 0; x < temp.length; x++) {
			System.out.println(temp[x]);	//5	8	1
		}
	}
}

最后附上完整的代码

import java.util.Arrays;

class Array {
	private int data[]; // 定义一个数组,用于保存传入数组的数据
	// 表示数组操作的下标,由于我们需要知道当前操作的是哪个下标,保证不会数组越界
	private int index;

	public Array(int length) { // 构造器,接受传入的数组长度
		if (length == 0) {
			this.data = new int[1]; // 当长度为0 的时候,保证能有一个元素存入
		} else {
			this.data = new int[length];// 根据传入的长度初始化
		}
	}

	/**
	 * 增加数组元素
	 * @param num
	 * @return
	 */
	public boolean add(int num) {
		if( this.index < this.data.length ) {	// 防止数组下标越界
			this.data[index] = num;
			
			index++;	// 保存完数据之后,下标增加
			return true;
		}
		return false;
	}
	
	public int[] getData(){
		return this.data;	// 获取数据
	}

}


//定义一个排序数组子类
class SortArray extends Array{

	// Array类里面现在没有无参构造的方法
	public SortArray(int length) {
		// 通过 super 调用,可以初始化出父类的 data数据
		super(length);	// 调用父类的有参构造方法
	}
	
	// 这里我们方法的重载,来保持和父类中的获取方法一致
	public int[] getData() {
		Arrays.sort(super.getData());
		return super.getData();
	}
}

// 定义一个反转类
class ReverseArray extends Array {

	public ReverseArray(int length) {
		super(length);
	}
	
	// 反转数据的逻辑,同样是保持和父类一样的方法名称,使用方法的重载实现
	public int[] getData() {// 需要得到的是反转数据
		
		int center = super.getData().length / 2;	// 获取数组的中间长度值
		int head = 0;								// 用于计算统计从头开始的数组值
		int tail = super.getData().length - 1;		// 由于数组的下标为0,减一 是为了从后开始计算
		for (int x = 0; x < center; x++) {
			int temp = super.getData()[head];
			super.getData()[head] = super.getData()[tail];
			super.getData()[tail] = temp;
			head++;
			tail--;
		}
		return super.getData();
	}
}

public class TestDemo {
	public static void main(String[] args) {
		ReverseArray arr = new ReverseArray(3);	// Array arr = new ReverseArray(3); 也可以通过向下转型的方式实现
		arr.add(1);
		arr.add(8);
		arr.add(5);
		
		int temp[] = arr.getData();
		for (int x = 0; x < temp.length; x++) {
			System.out.println(temp[x]);	//5	8	1
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayfreem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值