package XB;
/**
* 通过接口定义一组线性表中的操作
* @author 杜小唱
*
*/
public interface MyList {
int getSize();//返回线性表中元素的个数(数组下标从0开始)
boolean isEmpty();//判断线性表中是否(是否用boolean)包含元素,即判断线性表是否为空
void insert(int i,Object e) ;//为了元素的通用性,e的类型用Object,在线性表的i索引值添加元素e
boolean contains (Object e);//判断线性表中是否(是否用Boolean)包含元素e,包含返回true,不包含返回false
int indexOf(Object e);//返回元素e在线性表中的索引值,如果有返回,没有返回-1
Object remove(Object e);//删除线性表中第一个与e相同的元素,删除成功返回删除元素
Object remove(int i);//删除线性表中指定索引值为i的元素,返回删除元素,如果索引值i越界则报错
Object replace(int i,Object e);//把线性表中索引值为i的元素替换为元素e,返回旧的元素
Object get(int i);//返回线性表中索引值为i的元素
boolean insertBefore(Object p,Object e);//在线性表中元素p的前面插入元素e(看是否插入成功b5oolean)
boolean insertAfter(Object p,Object e);//在线性表中元素p的后面插入元素e(看是否插入成功boolean)
}
package XB;
/**
* 通过数组来实现线性表
* @author 杜小唱
*
*/
public class MyArrayList implements MyList {
private Object[] listElem;//定义数组来保存数据元素
private int curLen;//保存元素的个数,删除减,插入加.
//构造方法
public MyArrayList(int maxSize){
listElem=new Object[maxSize];//为顺序表分配maxSize个储存单元
}
//返回元素的个数
@Override
public int getSize() {
// TODO Auto-generated method stub
return curLen;
}
//判断线性表是否为空
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return curLen==0;
}
//在线性表i位置插入元素e,不是覆盖原本i位置的元素,涉及到数组元素索引值,要考虑是否越界问题
@Override
public void insert(int i, Object e) {
/**
* int len=listElem.length;
int newCount=this.curLen+len;这啥意思啊????答:扩容为原来数组长度的两倍
*/
//int len=listElem.length;
// int newCount=this.curLen+len;
if(curLen==listElem.length){
expandSpace();
}
if(i<0||i>curLen){
throw new IndexOutOfBoundsException("输入不合法");
}
for(int j=curLen;j>i;j--){
listElem[j]=listElem[j-1];
}
listElem[i]=e;
curLen++;
}
//数组扩容
public void expandSpace(){
Object[] temp=new Object[listElem.length*2];
for( int i=0;i
temp[i]=listElem[i];
}
listElem=temp;//???????
}
//判断线性表中是否存在元素e,存在返回true
@Override
public boolean contains(Object e) {
// TODO Auto-generated method stub
return indexOf(e)>=0;
}
//判断元素e在线性表中的第一次出现的索引值,如果不存在返回-1
@Override
public int indexOf(Object e) {
// TODO Auto-generated method stub
if(e==null){
for(int i=0;i
if(listElem[i]==null){
return i;
}
}
}else{
for(int i=0;i
if(e.equals(listElem[i])){
return i;
}
}
}
return -1 ;
}
//在线性表中删除第一个与e相同的元素
@Override
public Object remove(Object e) {
// TODO Auto-generated method stub
//获得e在线性表中定索引值
int index=indexOf(e);
if(index<0){
return null;//元素e在线性表中不存在
}
return remove(index);
}
//删除指定索引值的元素
@Override
public Object remove(int i) {
// TODO Auto-generated method stub
//判断i是否越界
if(i<0&&i>=curLen){
throw new IndexOutOfBoundsException(i+"越界");
}
//把元素e保存起来
Object old=listElem[i];
//把i+1开始的元素依次前移
for(int i1=0;i1<=curLen-1;i1++){
listElem[i1]=listElem[i1+1];
}
//把最后的元素置为null
listElem[curLen-1]=null;
//修改元素个数
curLen--;
return old;
}
@Override
public Object replace(int i, Object e) {
// TODO Auto-generated method stub
//判断i是否越界
if(i<0&&i>=curLen)
{
throw new IndexOutOfBoundsException(i+"越界");
}
Object old =listElem[i];
listElem[i]=e;
return old;
}
//返回线性表中索引值为i的元素
@Override
public Object get(int i) {
// TODO Auto-generated method stub
if(i<0&&i>=curLen)
{
throw new IndexOutOfBoundsException(i+"越界");
}
return listElem[i ];
}
//在线性表中元素p的前面插入元素e
@Override
public boolean insertBefore(Object p, Object e) {
// TODO Auto-generated method stub
//确定元素p在线性表中的位置
int index =indexOf(p);//返回p第一次出现的位置
//到底有没有,要判断
if(index<0){
return false;//p元素不存在,插入元素不成功
}
//插入元素
insert(index,e);
return true;
}
//在线性表中元素P的后面插入元素e
@Override
public boolean insertAfter(Object p, Object e) {
// TODO Auto-generated method stub
int index=indexOf(p);
if(index<0){
return false;
}
insert(index-1,e);
return true;
}
//重写toString方法
@Override
public String toString() {
// TODO Auto-generated method stub
//把线性表中每个元素链接起来,遍历数组中的每个元素
StringBuilder sb=new StringBuilder();
sb.append("[");
for(int i=0;i
sb.append(listElem[i]+",");
}
sb.append("]");
return sb.toString();
}
}
package XB;
/**
* 测试MyArrayList
* @author 杜小唱
*
*/
public class MyArrayListTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//1)创建一个MyArrayList对象
MyArrayList list1=new MyArrayList(5);
//判断是否为空
System.out.println(list1.isEmpty());
System.out.println(list1.getSize());
//添加元素
list1.insert(0, "aaa");
list1.insert(1, "bbb");
list1.insert(2, "ccc");
list1.insert(3, "ddd");
list1.insert(4, "eee");
list1.insert(5, "fff");
System.out.println(list1.isEmpty());
System.out.println(list1.getSize());
System.out.println(list1.toString());
//9)在指定元素的前面或者后面插入另外 元素
list1.insertBefore("ccc", "hhh");
System.out.println(list1);
list1.insertAfter("ccc", "kkk");
System.out.println(list1);
list1.insertAfter("vvv", "mmm");
System.out.println(list1);
}
}