目录
定义一个数组
public class MyArray {
//数组存储元素
private int[] data;
//当前数组实际存储的元素个数
private int size;
/**
* 根据传入的数组大小来开辟数组空间
* @param capacity 传入数组的大小
*/
public MyArray(int capacity){
data = new int[capacity];
}
}
增
-
在头部插入
/**
* 在数组的头部插入元素
* @param val 传入的元素值
*/
public void addFirst(int val){
if (size == data.length){
grow();
}
for (int i = size-1; i >= 0 ; i--) {
data[i+1] = data[i];
}
data[0] = val;
size++;
}
-
在尾部插入
/**
* 在数组的尾部插入元素
* @param val 传入的元素值
*/
public void addLast(int val){
//先要判断数组是否满
if(size == data.length){
grow();
}
data[size] = val;
size++;
}
-
根据索引插入
/**
* 根据索引来插入元素
* @param index 索引
* @param val 传入的元素
*/
public void addIndex(int index,int val) {
if (size == data.length) {
grow();
}
if (index < 0 || index > size) {
System.err.println("插入错误!");
return;
}
if (index == 0) {
addFirst(val);
return;//如果没有return的话,会插入两次
}
if (index == size) {
addLast(val);
} else {
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = val;
size++;
}
}
-
给数组扩容
private void grow(){
int[] newData = Arrays.copyOf(this.data,this.data.length << 1);
this.data =newData;
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
MyArray myArray = new MyArray(3);
myArray.addLast(1);
myArray.addLast(3);
myArray.addLast(5);
myArray.addLast(7);
//[1,3,5,7]
System.out.println(myArray);
myArray.addFirst(10);
//[10,1,3,5,7]
System.out.println(myArray);
myArray.addIndex(3,8);
myArray.addIndex(0,9);
myArray.addIndex(6,33);
//[9,10,1,3,8,5,33,7]
System.out.println(myArray);
}
}
删
-
删除头部元素
/**
* 删除头部元素
*/
public void removeFirst(){
for (int i = 0; i <= size-1 ; i++) {
data[i] = data[i+1];
}
size--;
}
-
删除尾部元素
/**
* 删除尾部元素
*/
public void removeLast(){
removeIndex(size-1);
}
-
根据索引删除元素
/**
* 根据索引删除元素
* @param index
*/
public void removeIndex(int index){
if(index < 0 || index >= size){
System.out.println("索引非法!");
return;
}
for (int i = index; i < size ; i++) {
data[i] = data[i+1];
}
size--;
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
MyArray myArray = new MyArray(3);
myArray.addLast(1);
myArray.addLast(3);
myArray.addLast(5);
myArray.addLast(7);
//[1,3,5,7]
System.out.println(myArray);
myArray.addFirst(10);
//[10,1,3,5,7]
System.out.println(myArray);
myArray.addIndex(3,8);
myArray.addIndex(0,9);
myArray.addIndex(6,33);
//[9,10,1,3,8,5,33,7]
System.out.println(myArray);
myArray.removeIndex(0);
myArray.removeIndex(2);
myArray.removeIndex(5);
//[10,1,8,5,33]
System.out.println(myArray);
myArray.removeFirst();
myArray.removeLast();
//[1,8,5]
System.out.println(myArray);
}
}
改
-
根据索引修改,返回修改前的元素值
/**
* 根据索引修改,返回修改前的元素值
* @param index
* @param newVal
* @return
*/
public int set(int index,int newVal){
if(index < 0 || index > size-1){
System.out.println("索引非法!");
return -1;
}
int oldVal = data[index];
data[index] = newVal;
return oldVal;
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
MyArray myArray = new MyArray(3);
myArray.addLast(1);
myArray.addLast(3);
myArray.addLast(5);
myArray.addLast(7);
//[1,3,5,7]
System.out.println(myArray);
myArray.addFirst(10);
//[10,1,3,5,7]
System.out.println(myArray);
myArray.addIndex(3,8);
myArray.addIndex(0,9);
myArray.addIndex(6,33);
//[9,10,1,3,8,5,33,7]
System.out.println(myArray);
myArray.removeIndex(0);
myArray.removeIndex(2);
myArray.removeIndex(5);
//[10,1,8,5,33]
System.out.println(myArray);
myArray.removeFirst();
myArray.removeLast();
//[1,8,5]
System.out.println(myArray);
myArray.set(0,3);
myArray.set(1,6);
myArray.set(2,8);
//[3,6,8]
System.out.println(myArray);
}
}
查
-
根据元素值查询
/**
* 根据元素值查询
* @param val
* @return
*/
public boolean contains(int val){
int index =getByVal(val);
if(index == -1){
return false;
}
return true;
}
-
根据索引查询
/**
* 根据索引查询
* @param index
* @return
*/
public int getVal(int index){
if(index < 0 || index > size-1){
System.out.println("索引非法!");
}
return data[index];
}
-
根据元素值查找对应的索引下标
/**
* 根据元素值查找对应的索引下标
* @param val 输入的元素值
* @return
*/
public int getByVal(int val){
for (int i = 0; i < size; i++) {
if (data[i] == val){
return i;
}
}
System.out.println("该元素不存在!");
return -1;//该元素不存在
}
-
测试
/**
* @author happy
*/
public class Test {
public static void main(String[] args) {
MyArray myArray = new MyArray(3);
myArray.addLast(1);
myArray.addLast(3);
myArray.addLast(5);
myArray.addLast(7);
//[1,3,5,7]
System.out.println(myArray);
myArray.addFirst(10);
//[10,1,3,5,7]
System.out.println(myArray);
myArray.addIndex(3,8);
myArray.addIndex(0,9);
myArray.addIndex(6,33);
//[9,10,1,3,8,5,33,7]
System.out.println(myArray);
myArray.removeIndex(0);
myArray.removeIndex(2);
myArray.removeIndex(5);
//[10,1,8,5,33]
System.out.println(myArray);
myArray.removeFirst();
myArray.removeLast();
//[1,8,5]
System.out.println(myArray);
myArray.set(0,3);
myArray.set(1,6);
myArray.set(2,8);
//[3,6,8]
System.out.println(myArray);
//false
//8
//0
System.out.println(myArray.contains(2));
System.out.println(myArray.getVal(2));
System.out.println(myArray.getByVal(3));
}
}
toString()方法输出
public String toString() {
String ret = "[";
for (int i = 0; i < size; i++) {
ret += data[i];
if (i != size - 1) {
ret += ",";
}
}
ret += "]";
return ret;
}
全部代码
import java.util.Arrays;
/**
* @author happy
* 基于数组的顺序表
*/
public class MyArray {
//数组存储元素
private int[] data;
//当前数组实际存储的元素个数
private int size;
/**
* 根据传入的数组大小来开辟数组空间
* @param capacity 传入数组的大小
*/
public MyArray(int capacity){
data = new int[capacity];
}
/**
* 在数组的头部插入元素
* @param val 传入的元素值
*/
public void addFirst(int val){
if (size == data.length){
grow();
}
for (int i = size-1; i >= 0 ; i--) {
data[i+1] = data[i];
}
data[0] = val;
size++;
}
/**
* 根据索引来插入元素
* @param index 索引
* @param val 传入的元素
*/
public void addIndex(int index,int val) {
if (size == data.length) {
grow();
}
if (index < 0 || index > size) {
System.err.println("插入错误!");
return;
}
if (index == 0) {
addFirst(val);
return;//如果没有return的话,会插入两次
}
if (index == size) {
addLast(val);
} else {
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = val;
size++;
}
}
/**
* 在数组的尾部插入元素
* @param val 传入的元素值
*/
public void addLast(int val){
//先要判断数组是否满
if(size == data.length){
grow();
}
data[size] = val;
size++;
}
/**
* 删除头部元素
*/
public void removeFirst(){
for (int i = 0; i <= size-1 ; i++) {
data[i] = data[i+1];
}
size--;
}
/**
* 删除尾部元素
*/
public void removeLast(){
removeIndex(size-1);
}
/**
* 根据索引删除元素
* @param index
*/
public void removeIndex(int index){
if(index < 0 || index >= size){
System.out.println("索引非法!");
return;
}
for (int i = index; i < size ; i++) {
data[i] = data[i+1];
}
size--;
data[size] = 0;
}
/**
* 根据索引修改,返回修改前的元素值
* @param index
* @param newVal
* @return
*/
public int set(int index,int newVal){
if(index < 0 || index > size-1){
System.out.println("索引非法!");
return -1;
}
int oldVal = data[index];
data[index] = newVal;
return oldVal;
}
/**
* 根据元素值查找对应的索引下标
* @param val 输入的元素值
* @return
*/
public int getByVal(int val){
for (int i = 0; i < size; i++) {
if (data[i] == val){
return i;
}
}
return -1;//该元素不存在
}
/**
* 根据元素值查询
* @param val
* @return
*/
public boolean contains(int val){
int index =getByVal(val);//
if(index == -1){
return false;
}
return true;
}
/**
* 根据索引查询
* @param index
* @return
*/
public int getVal(int index){
if(index < 0 || index > size-1){
System.out.println("索引非法!");
}
return data[index];
}
public String toString() {
String ret = "[";
for (int i = 0; i < size; i++) {
ret += data[i];
if (i != size - 1) {
ret += ",";
}
}
ret += "]";
return ret;
}
private void grow(){
int[] newData = Arrays.copyOf(this.data,this.data.length << 1);
this.data =newData;
}
}