基于ArrayList实现有序表

来源:互联网 发布:win7设置禁止安装软件 编辑:程序博客网 时间:2024/06/05 11:50

      所谓有序表就是线性表中的元素已经按一定的顺序进行排列(升序或降序),并且规定有序表中不含重复的元素。即在一个有序表中添加或删除一个元素时,用户只需要提供这个元素,而不需要说明该元素应该位于或者原来位于线性表中的什么位序,有序表就能为用户完成这个操作。那么线性表与有序表究竟有哪些不同呢?

     在线性表中,用户插入元素时,可以指定元素的插入位置,而在有序表中不希望有这样的操作,因为有序表有责任组织它的元素,并保证它们有序。所以,有序表中的用户进行插入元素时,只需要提供新元素,为确定新元素的位序,有序表的内部会将新元素与其原有元素进行比较,因此有序表中的元素还必须是相互可以比较的对象。

     下面就是基于java类库中的ArrayList类,实现的有序表,话不多说,直接上图。

package test.practice.java;import java.util.ArrayList;import java.util.Random;import test.practice.myInterface.SortedListInterface;/** * 合成操作实现有序表 * @key * @author S.M.Q  * 2014年9月22日上午10:49:32 * @param <T> */public class SortedArrayList<T extends Comparable<? super T>>implements SortedListInterface<T> {private static final  int MAX_SIZE=50;private ArrayList<T> myList;/** * 默认构造函数 */SortedArrayList(){myList=new ArrayList<T>(MAX_SIZE);}/** * 带参数的构造函数 * @param maxSize */SortedArrayList(int maxSize){myList=new ArrayList<T>(maxSize);}/** * 有序表的增加元素操作,只需要提供新元素即可 */public boolean add(T newEntry){ try { myList.add(Math.abs(getPosition(newEntry)),newEntry); return true; }catch(Exception e){     return false; }}/** * 有序表中的getPosition操作,给定有序表中的元素,返回元素在有序表中的位置(从0开始) * (1)若有序表中存在该元素,则直接返回该元素的序号 * (2)若有序表中不存在该元素,则返回的序号是负的,表示该元素应该在有序表中的位置 */public int getPosition(T anEntry){int myPosition=0;for(myPosition=0;myPosition<myList.size();myPosition++){if(!(getEntry(myPosition).compareTo(anEntry)<0))break;}if(!myList.contains(anEntry))myPosition=-myPosition;return myPosition;}/** * 删除有序表中的某个元素,跟线性表的操作类似 */public boolean remove(T anEntry){int myPosition=getPosition(anEntry);try{myList.remove(myPosition);return true;}catch(Exception e){return false;}}/** * 有序表中是否包含某元素,跟线性表的类似 */public boolean contains(T anEntry){return myList.contains(anEntry);}/** * 清空有序表的内容 */public void clear(){myList.clear();}/** * 删除某个位置的元素 */public T remove(int index){return myList.remove(index);}/** * 有序表是否为空 */public boolean isEmpty(){return myList.isEmpty();}/** * 有序表是否已满 */public boolean isFull(){return myList.size()<=MAX_SIZE;}    /**     * 返回某个序号的元素     */@Overridepublic T getEntry(int givenPosition) {// TODO Auto-generated method stubreturn myList.get(givenPosition);}    /**     * 返回有序表的长度     */@Overridepublic int getLength() {// TODO Auto-generated method stubreturn myList.size();}    /**     * 打印有序表中的所有元素     */@Overridepublic void display() {// TODO Auto-generated method stubfor(int i=0;i<myList.size();i++){System.out.print(myList.get(i)+" ");}System.out.println();}/** * 有序表的测试,随机生成20个1~1000之间的整数, * (1)先在有序表中添加两个测试因子,来测试其remove操作 * (2)依次将20个随机整数加入到有序表中,并打印这20个整数加入有序表之前的顺序 * (3)打印20个整数加入有序表后,在有序表中的顺序以及删除两个测试因子后,这个有序表的顺序 * @param args */public static void main(String args[]){SortedArrayList<Integer> sortedArrayList=new SortedArrayList<Integer>();sortedArrayList.add(440);sortedArrayList.add(734);for(int i=0;i<20;i++){int element=new Random().nextInt(1000);sortedArrayList.add(element);System.out.print(element+" ");} System.out.println("有序表中的数:"); sortedArrayList.display();  sortedArrayList.remove(new Integer(440)); sortedArrayList.remove(new Integer(734));  sortedArrayList.display();}}

0 0