欢迎光临
我们一直在努力

Java实现顺序表

为了规范功能,我们创建一个接口来规定顺序表要实现的功能。

IList.java

public interface IList {

// 在顺序表末尾添加元素
public void add(int data);

// 在指定位置 pos 插入元素 data
public void add(int pos, int data);

// 判断顺序表中是否包含指定元素
public boolean contains(int toFind);

// 查找元素第一次出现的位置,找不到返回 -1
public int indexOf(int toFind);

// 获取 pos 位置的元素
public int get(int pos);

// 修改 pos 位置的元素为 value
public void set(int pos, int value);

// 删除第一次出现的 toRemove 元素
public void remove(int toRemove);

// 返回顺序表中有效元素个数
public int size();

// 清空顺序表
public void clear();

// 打印顺序表中所有元素
public void display();

// 判断顺序表是否已满
boolean isFull();

// 判断顺序表是否为空
public boolean isEmpty();
}

之后我们来实现这些功能。

add(int data)很简单,在末尾添加元素就行,注意不要忘记usedSize++,还有要先检查表中数据是否满了,如果满了要扩容。

add(int pos, int data)要先判断pos是否合法,之后把pos及以后的数向后挪,首先也要检查表是否满。挪后在pos位置插入data,并让usedSize++。

contains(int toFind)先判断表是否为空,不为空循环在表中找就行了。

indexOf(int toFind)判断表是否为空,不为空循环在表中找。

get(int pos)判断pos是否合法,合法了再寻找元素。

set(int pos, int value)判断pos是否合法,如果合法再修改该元素位置。

remove(int toRemove)判断表是否为空,不为空循环在表中找。

size()返回usedSize即可。

clear()顺序表置0即可。

display()循环打印即可。

isFull()判断表的usedSized是否等于表的长度。

当然为了实现时方便,我还增加了这些。

checkPosOnAdd(int pos)判断插入pos是否在0-usedSized之间。

checkCapacity判断空间是否足够,不够的话扩容。

checkPosOnGetSet判断获取pos是否合法。

MyArrayList.java

import java.util.Arrays;
public class MyArrayList implements IList{
public int[] elem;
public int usedSize;
public static final int DEFAULT_SIZE=10;

public MyArrayList(){
this.elem=new int[DEFAULT_SIZE];
}
public MyArrayList(int capacity){
this.elem=new int[capacity];
}
@Override
public void add(int data) {
checkCapacity();
this.elem[this.usedSize++]=data;
}

@Override
public void add(int pos, int data) {
try{
checkPosOnAdd(pos);
}catch(PosIllegality e){
e.printStackTrace();
return;
}
checkCapacity();
for(int i=usedSize-1;i>=pos;i–){
elem[i+1]=elem[i];
}
elem[pos]=data;
usedSize++;
}

private void checkPosOnAdd(int pos) throws PosIllegality{
if(pos<0||pos>usedSize){
System.out.println("不合法!");
throw new PosIllegality("插入元素下标异常:"+pos);
}
}

private void checkCapacity(){
if(isFull()){
elem= Arrays.copyOf(elem,elem.length*2);
}
}

@Override
public boolean contains(int toFind) {
if(isEmpty())
return false;
for(int i=0;i<usedSize;i++){
if(elem[i]==toFind)
return true;
}
return false;
}

@Override
public int indexOf(int toFind) {
if(isEmpty())
return -1;
for(int i=0;i<usedSize;i++){
if(elem[i]==toFind)
return i;
}
return -1;
}

@Override
public int get(int pos) {
checkPosOnGetSet(pos);
if(isEmpty())
{
throw new MyArrayListEmpty("获取指定下标元素时" + "顺序表为空!");
}
return elem[pos];
}

private void checkPosOnGetSet(int pos) throws PosIllegality{
if(pos<0||pos>=usedSize){
System.out.println("不合法!");
throw new PosIllegality("获取指定下标的元素异常:"+pos);
}
}

@Override
public void set(int pos, int value) {
checkPosOnGetSet(pos);
elem[pos]=value;
}

@Override
public void remove(int toRemove) {
int index=indexOf(toRemove);
if(index==-1){
System.out.println("不存在");
return;
}
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() {
this.usedSize=0;
}

@Override
public void display() {
for(int i=0;i<this.usedSize;i++){
System.out.print(this.elem[i]+" ");
}
System.out.println();
}

@Override
public boolean isFull() {
return usedSize==elem.length;
}

@Override
public boolean isEmpty() {
return usedSize==0;
}
}

`try…catch` 用来 捕获并处理异常,防止程序因为错误直接崩溃。

为了防止顺序表为空还要删除、获取元素这种情况,我自定义了一个异常,代码如下。

MyArrayListEmpty.java

public class MyArrayListEmpty extends RuntimeException{
public MyArrayListEmpty(String msg){
super(msg);
}
}

继承 `RuntimeException`,属于运行时异常。

为了当数组下标越界、位置不合法时抛出异常,还定义了一个异常,代码如下。

PosIllegality .java

public class PosIllegality extends RuntimeException{
public PosIllegality(String msg){
super(msg);
}
}

测试代码如下。

Test.java

public class Test {
public static void main(String[] args) {
MyArrayList myArrayList =new MyArrayList();
myArrayList.add(1);
myArrayList.add(2);
myArrayList.add(3);
myArrayList.display();

myArrayList.add(3,99);
myArrayList.display();

myArrayList.set(3,888);
myArrayList.display();

myArrayList.remove(1);
myArrayList.display();

}
}

赞(0)
未经允许不得转载:171主机测评 » Java实现顺序表
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址