顺序排序表只是继承了顺序表,改变了里面一些内容。另外可以把search函数做一下优化,改为二分查找。
https://blog.csdn.net/king8611/article/details/81065297
这是昨天写的顺序表,顺序排序表就是继承这个,其中需要重载的函数有insert相关的函数,set函数变为不可用函数。然后可以把search函数优化一下。
public class SortedSeqList<T extends Comparable<?super T>> extends SeqList<T>{
public SortedSeqList(){
super();
}
public SortedSeqList(int length){
super(length);
}
public SortedSeqList(T values[]){
super(values.length);
for(int i=0;i<values.length;i++)
this.insert(values[i]);
}
public int insert(T x){ //循序表的插入函数
Object obj[]=element;
if(this.size()==element.length){ //如果数组已满,扩充数组。
element=new Object[2*this.size()];
for(int i=0;i<size();i++){
element[i]=obj[i];
}
}
int i=0;
if(this.isEmpty()||x.compareTo(this.get(this.size()-1))>0) //如果这个表是空的或者插入的数大于最后一个数,那就直接插入最后
i=this.n;
else while(i<this.n&&x.compareTo(this.get(i))>0)
i++;
super.insert(i,x);
return i;
}
public int insertDifferent(T x) { //查询插入,若表中不存在这个数时,插入这个数
int i=search(x);
if(i==-1){insert(x);}
return i;
}
public int search(T key) { //查询函数,因为是顺序表,所以可以利用二分查找
int lb=-1,ub=this.size();
while(ub-lb>1){
int mid=(lb+ub)/2;
if(super.get(mid).compareTo(key)>=0)ub=mid;
else lb=mid;
}
if(!super.get(ub).equals(key))ub=-1;
return ub;
}
public int remove(T key){
int i=search(key);
super.remove(i);
return i;
}
public void addAll(SeqList<? extends T> list) {
if(list==null)throw new NullPointerException("x==null");
for(int i=0;i<list.size();i++){
insert(list.get(i));
}
}
//--------这两个方法顺序表不支持------------//
public void set(int i, T x) {
throw new UnsupportedOperationException("set(int i,T x)");
}
public int insert(int i, T x) {
throw new UnsupportedOperationException("insert(int i,T x)");
}
}
然后是测试类:
public class SortedSeqListTest {
public static void main(String[] args) {
List<Integer> list=new SortedSeqList<Integer>();
for(int i=20;i>=0;i-=2)list.insert(i); //插入一批数
System.out.println(list.toString()); //打印一下
System.out.println(list.search(5)); //寻找函数
System.out.println(list.search(6));
list.remove(new Integer(6));
System.out.println(list.toString());
List<Integer> list2=new SeqList<Integer>();
for(int i=15;i>1;i--)list2.insert(i);
System.out.println(list2);
list.addAll(list2); //addAll函数
System.out.println(list.toString());
}
}
测试结果:
线性表.SortedSeqList(0,2,4,6,8,10,12,14,16,18,20)
-1
3
线性表.SortedSeqList(0,2,4,8,10,12,14,16,18,20)
线性表.SeqList(15,14,13,12,11,10,9,8,7,6,5,4,3,2)
线性表.SortedSeqList(0,2,2,3,4,4,5,6,7,8,8,9,10,10,11,12,12,13,14,14,15,16,18,20)
如果有什么错误欢迎大佬们纠正哦(。・∀・)ノ