文章目录
前言
JavaSE初阶段的学习已步入了尾声,我即将迈进新的篇章————数据结构的学习,今天我将和大家分享一种数据结构线性表中的顺序表。
一、顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
1.myArrayList的实现
1.1 IList接口
其中存放我们需要实现的方法
例如:
interface Ilist {
// 新增元素,默认在数组最后新增
void add(int data) ;
// 在 pos 位置新增元素
void add(int pos, int data) ;
// 判定是否包含某个元素
boolean contains(int toFind);
// 查找某个元素对应的位置
int indexOf(int toFind);
// 获取 pos 位置的元素
int get(int pos) ;
// 给 pos 位置的元素设为 value
void set(int pos, int value) ;
//删除第一次出现的关键字key
void remove(int toRemove) ;
// 获取顺序表长度
int size();
// 清空顺序表
void clear() ;
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
void display() ;
}
1.2myArraylist类
实现具体的方法
myArraylist类的基本属性如下:
public class MyArrayList implements Ilist{
public int[] elem;
public int usedSize;
public static final int DEFAULT_CAPACITY=5;//初始的容量
public MyArrayList() {
elem=new int[DEFAULT_CAPACITY];
}
1.2.1 add方法
添加顺序表中的元素
1.尾插法
2.任意位置添加
public void add(int data) {
//判断顺序表是否满了
if(isFull()){
elem= Arrays.copyOf(elem,2*elem.length);
}
elem[usedSize]=data;
usedSize++;
}
public boolean isFull(){
return usedSize==elem.length;
}
private void checkPosOfAdd (int pos){
if (pos<0&&pos>usedSize){
throw new PosException("插入位置不合法!");
}
}
public void add(int pos, int data) {
checkPosOfAdd(pos);
if(isFull()){
elem= Arrays.copyOf(elem,2*elem.length);
}
for (int i = usedSize-1; i >=pos ; i--) {
elem[i+1]=elem[i];
}
elem[pos]=data;
usedSize++;
}
1.2.2 contains方法
判定是否包含某个元素
public boolean contains(int toFind) {
for(int i=0;i<usedSize;i++){
if(toFind==elem[i]){
return true;
}
}
return false;
}
1.2.3 indexOf方法
查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i <usedSize ; i++) {
if (elem[i]==toFind){
return i;
}
}
return -1;
}
1.2.4 get方法
获取 pos 位置的元素
public boolean isEmpty(){
return usedSize==0;
}
public void checkPosOfGet(int pos){
if(pos<0&&pos>=usedSize){
throw new PosException("pos位置不合法:"+pos);
}
}
public int get(int pos) {
checkPosOfGet(pos);
if (isEmpty()){
throw new EmptyException("顺序表为空!");
}
return elem[pos];
}
1.2.5 set方法
给 pos 位置的元素设为 value
public void set(int pos, int value) {
checkPosOfAdd(pos);
if(isEmpty()){
throw new EmptyException("顺序表为空!");
}
this.elem[pos]=value;
}
1.2.6 remove方法
删除第一次出现的关键字key
public void remove(int toRemove) {
if (isEmpty()){
throw new EmptyException("顺序表为空");
}
int index=indexOf(toRemove);
for (int i = index; i <usedSize-1 ; i++) {
elem[i]=elem[i+1];
}
usedSize--;
}
1.2.7 size,clear,display方法
1.获取顺序表长度
2.清空顺序表
3打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public int size() {
return this.usedSize;
}
@Override
public void clear() {
usedSize=0;
}
@Override
public void display() {
for (int i=0;i<usedSize;i++){
System.out.println(elem[i]+" ");
}
System.out.println();
}
1.3 PosException类
用于声明pos位置不合法的异常类
public class PosException extends RuntimeException {
public PosException() {
}
public PosException(String message) {
super(message);
}
}
1.4 EmptyException类
用于判断顺序表是否为空的异常类
public class EmptyException extends RuntimeException{
public EmptyException() {
}
public EmptyException(String message) {
super(message);
}
}
1.5 Test类
使用main方法检测方法的实现
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList=new MyArrayList();
myArrayList.display();
myArrayList.add(1);
myArrayList.add(2);
myArrayList.add(3);
myArrayList.add(4);
myArrayList.add(5);
myArrayList.display();
myArrayList.remove(4);
myArrayList.indexOf(1);
myArrayList.display();
}
}
2.完整代码及操作实例 可忽略
package list;
interface Ilist {
// 新增元素,默认在数组最后新增
void add(int data) ;
// 在 pos 位置新增元素
void add(int pos, int data) ;
// 判定是否包含某个元素
boolean contains(int toFind);
// 查找某个元素对应的位置
int indexOf(int toFind);
// 获取 pos 位置的元素
int get(int pos) ;
// 给 pos 位置的元素设为 value
void set(int pos, int value) ;
//删除第一次出现的关键字key
void remove(int toRemove) ;
// 获取顺序表长度
int size();
// 清空顺序表
void clear() ;
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
void display() ;
}
package list;
import java.util.Arrays;
public class MyArrayList implements Ilist{
public int[] elem;
public int usedSize;
public static final int DEFAULT_CAPACITY=5;
public MyArrayList() {
elem=new int[DEFAULT_CAPACITY];
}
@Override
public void add(int data) {
//判断顺序表是否满了
if(isFull()){
elem= Arrays.copyOf(elem,2*elem.length);
}
elem[usedSize]=data;
usedSize++;
}
public boolean isFull(){
return usedSize==elem.length;
}
private void checkPosOfAdd (int pos){
if (pos<0&&pos>usedSize){
throw new PosException("插入位置不合法!");
}
}
public void add(int pos, int data) {
checkPosOfAdd(pos);
if(isFull()){
elem= Arrays.copyOf(elem,2*elem.length);
}
for (int i = usedSize-1; i >=pos ; i--) {
elem[i+1]=elem[i];
}
elem[pos]=data;
usedSize++;
}
@Override
public boolean contains(int toFind) {
for(int i=0;i<usedSize;i++){
if(toFind==elem[i]){
return true;
}
}
return false;
}
@Override
public int indexOf(int toFind) {
for (int i = 0; i <usedSize ; i++) {
if (elem[i]==toFind){
return i;
}
}
return -1;
}
public boolean isEmpty(){
return usedSize==0;
}
public void checkPosOfGet(int pos){
if(pos<0&&pos>=usedSize){
throw new PosException("pos位置不合法:"+pos);
}
}
public int get(int pos) {
checkPosOfGet(pos);
if (isEmpty()){
throw new EmptyException("顺序表为空!");
}
return elem[pos];
}
@Override
public void set(int pos, int value) {
checkPosOfAdd(pos);
if(isEmpty()){
throw new EmptyException("顺序表为空!");
}
this.elem[pos]=value;
}
@Override
public void remove(int toRemove) {
if (isEmpty()){
throw new EmptyException("顺序表为空");
}
int index=indexOf(toRemove);
for (int i = index; i <usedSize-1 ; i++) {
elem[i]=elem[i+1];
}
usedSize--;
}
@Override
public int size() {
return this.usedSize;
}
@Override
public void clear() {
usedSize=0;
}
@Override
public void display() {
for (int i=0;i<usedSize;i++){
System.out.println(elem[i]+" ");
}
System.out.println();
}
}
package list;
public class EmptyException extends RuntimeException{
public EmptyException() {
}
public EmptyException(String message) {
super(message);
}
}
package list;
public class PosException extends RuntimeException {
public PosException() {
}
public PosException(String message) {
super(message);
}
}
package list;
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList=new MyArrayList();
myArrayList.display();
myArrayList.add(1);
myArrayList.add(2);
myArrayList.add(3);
myArrayList.add(4);
myArrayList.add(5);
myArrayList.display();
myArrayList.remove(4);
myArrayList.indexOf(1);
myArrayList.display();
}
}