JAVA学习心得-----关于数组以及运用数组自定义队列
数组:
1.储存规定长度并且需要存入数据为相同类型。
2.格式为 数据类型[] 数组名 = new 数据类型[]{内容};
例如: 整形数组
int[] S = new int[]{1,2,3};
字符串数组
String[] S = new String[]{“a”,“b”,“c”};
可以不填入内容,在[]写入数字n,那么便创建了一个长度为n的内容是"空"的数列。
3.数组具有连续性,无法直接用本体数组来实现增添删除操作。
4.数组里的内容可以重复,无影响。
队列
格式:Queue queue = new LinkedList<类型>();
许多地方都会说队列先进先出,无长度限制,这实际是JAVA中原Queue里的方法造成的结果,我们也能够自己写入方法,来模拟、改变原JAVA中队列的规则。
自定义队列思路
根本:运用数组来实现规则。
这里的示范,我只让队列存入String类型的数据,数组用String类型来定义。以下图片中的数字代表下标,a表示数据。
1.首先需要一个存有运算规则的类,新建一个MyQueue.java
public class MyQueue {
//首先创建一个用来存数据的数组
private String[] text = new String[0];
//下面编写运算方法
}
即可。
2.(写入MyQueue类中)实现添加的功能,运用两个数组进行操作,创建一个比上一个数组长度多1的新数组,将原来数组拥有的数据复制过来,并加入新的数据,最后新数组覆盖掉原数组即可。这里模拟队列,只添加在最后一位。
//添加(到数组最后)
public void add(String a) {
//创建一个新数组,比第一个数组长度多1
String[] Ntext = new String[text.length+1];
//将原数组的数据复制给新数组
for(int i=0;i<text.length;i++) {
Ntext[i] = text[i];
}
//将加入的数据放到新数组的最后一位
Ntext[Ntext.length-1] = a;
//将地址指向新的数组,可以理解为把新数组的数据赋值给原来的数组
text = Ntext;
3.实现获取数据功能。
//从队列中取出一个
public String get(int index) {
//运用下标来返回数组中的值
String a = text[index];
return a;
}
4.实现返回长度的功能。
//队列的长度
public int size() {
return text.length;
}
5.实现删除功能。模拟队列删除最后一个,只需复制原数组的最后一个数据之前的数据,给新数组即可。
//去除最后一个
public void cutlist(){
//当队列长度为0时
if(text.length == 0) {
System.out.println("长度为0,无法删除");
}
//创建一个新数组,比第一个数组长度少1
else {
String[] Ntext = new String[text.length-1];
//将原数组的数据长度-1的数据,复制给新数组
for(int i=0;i<text.length-1;i++) {
Ntext[i] = text[i];
}
//将地址指向新的数组,可以理解为把新数组的数据赋值给原来的数组
text = Ntext;
}
}
6.实现插入功能,在添加的基础上改进,实现把输入的数据插入到下标位置。思路是复制下标前原数组的内容,在下标出输入a数据,然后复制后一段的内容。需要注意下标的更换。
//插入到下标index之后
public void insert(String a,int index) {
//创建一个新数组,比第一个数组长度多1
String[] Ntext = new String[text.length+1];
//越界判定
if(index+1 > text.length||index < 0) {
System.out.println("超出长度,撤销替换指令!");
}
else {
//将输入数字下标前的数据复制给新数组
for(int i=0;i<index+1;i++) {
Ntext[i] = text[i];
}
//在下标处插入数据a
Ntext[index+1] = a;
//将输入数字下标后的数据复制给新数组
for(int j=index+2;j<text.length+1;j++) {
Ntext[j] = text[j-1];
}
//将地址指向新的数组,可以理解为把新数组的数据赋值给原来的数组
text = Ntext;
}
}
7.实现替换功能,输入(数据,下标),替换掉下标处的数据,分别复制下标前与下标后的数据给新数组。我这里是产生比原数组长度多1的新数组,所以会产生1个空位,只需再添加删除里面的逻辑,把最后一个空值删掉即可。
//替换下标index处的元素
public void replace(String a,int index) {
//创建一个新数组,比第一个数组长度多1
String[] Ntext = new String[text.length+1];
//越界判定
if(index > text.length||index < 0) {
System.out.println("超出长度,撤销替换指令!");
}
else {
//将输入数字下标前的数据复制给新数组
for(int i=0;i<index;i++) {
Ntext[i] = text[i];
}
//在下标处插入数据a
Ntext[index] = a;
//将输入数字下标后的数据复制给新数组
for(int j=index+1;j<text.length;j++) {
Ntext[j] = text[j];
}
//将地址指向新的数组,可以理解为把新数组的数据赋值给原来的数组
text = Ntext;
}
}
8.实现删除指定位置的功能,输入下标,删除掉指定位置的数据。复制下标前与下标后的数据给新数组即可,需要注意新数组中,下标的移动。下图表示,删除的是下标2的数据。
//移除指定位置
public void move(int index) {
//创建与原长度相等的新数组
String[] Ntext = new String[text.length];
//将需要去掉的值之前的数给新数组
if(index!=text.length) {
//越界判定
if(index>text.length) {
System.out.println("错误!删除指令撤销!");
}
//
else {
for(int i=0;i<index;i++) {
Ntext[i] = text[i];
}
for(int j=index+1;j<text.length;j++) {
Ntext[j-1] = text[j];
}
text = Ntext;
}
}
//当需要删除的数是最后一位时
else {
//将原数组的数据长度-1的数据,复制给新数组
for(int i=0;i<text.length-1;i++) {
Ntext[i] = text[i];
}
text = Ntext;
// 将地址指向新的数组,可以理解为把新数组的数据赋值给原来的数组
}
}
就先实现这几个功能,接下来加入主函数验证一下是否成功。
//主函数
public static void main(String args[]) {
MyQueue tt = new MyQueue();
//测试添加
tt.add("green");
tt.add("blue");
tt.add("你好");
tt.add("飞机");
//添加后
System.out.println("队列中数据有["+tt.get(0)+","+tt.get(1)+","+tt.get(2)+","+tt.get(3)+"]");
tt.insert("hello",1);
//测试插入
System.out.println("-------------插入后----------");
System.out.println("队列中数据有["+tt.get(0)+","+tt.get(1)+","+tt.get(2)+","+tt.get(3)+","+tt.get(4)+"]");
//测试替换
tt.replace("红色",0);
System.out.println("-------------替换后----------");
System.out.println("队列中数据有["+tt.get(0)+","+tt.get(1)+","+tt.get(2)+","+tt.get(3)+","+tt.get(4)+"]");
//测试删除
tt.move(2);
System.out.println("-------------删除后----------");
System.out.println("队列中数据有["+tt.get(0)+","+tt.get(1)+","+tt.get(2)+","+tt.get(3)+","+tt.get(4)+"]");
}
结果输出: