数据结构与算法(Java描述)-13、对象数组以及MyVector类、MySet类实现

一、数组

数组是n(n≥1)个相同数据类型的数据元素a0,a1,a2,...,an-1构成的占用一块地址连续的内存单元的有限集合。

数组通常以字节为内部计数单位。对一个有n个数据元素的一维数组,设a0是下标为0的数组元素,Loc(a0)是a0的内存单元地址,k是每个数据元素所需的字节个数,则数组中任一数据元素ai的内存单元地址Loc(ai)可由下面公式求出:
  Loc(ai) = Loc(a0) + i × k   ( 0≤i<n ) 

对一个m行n列的二维数组,设a00是行下标和列下标均为0的数组元素,Loc(a00)是a00的存储地址,k是每个数据元素所需的字节个数,则数组中任一数据元素aij的内存单元地址Loc(aij)可由下面公式求出:
 Loc(aij) = Loc(a00) + (i × n + j) × k  
( 0≤i<m, 0≤j<n)

二维数组的顺序存储结构:


数组抽象数据类型:

数据集合:数组的数据集合可以表示为a0, a1, a2, ..., an-1,且限定数组元素必须存储在地址连续的内存单元中。
操作集合:
(1)分配内存空间acclocate():为数组分配用户所需的内存空间。
(2)取数组长度getLength():取数组的长度。
(3)存数组元素set(i, x):把数据元素x存入下标为i的数组中。其约束条件为:0≤i≤getLength()-1。
(4)取数组元素get(i):取出数组中下标为i的数据元素。其约束条件为:0≤i≤getLength()-1。

Java语言支持的数组功能:

基本数据类型的数组
     由于数组是非常基础的程序设计语言要素,所以Java语言设计实现了数组功能。Java语言(以及大部分高级程序设计语言)支持的数组操作有:
(1)分配内存空间 
(2)获得数组长度 
(3)存数组元素 
(4)取数组元素 

对象数组
     除了可以定义基本数据类型的数组外,Java语言还可以定义对象数组。


二、向量类

Java语言只直接支持上述基本的数组操作。如果程序开始时定义的数组长度为10,且数组中已经存放了若干数据元素,要在程序运行过程中扩充数组长度为20,且把数组中原先存放的数据元素原样保存,则系统不提供直接支持,需要应用程序自己实现。
为了扩充数组功能,Java类库还定义了Vector类。要说明的是,国内的大部分教材和科技书籍都把Vector类翻译为向量类,但这里的向量和数学上的向量概念完全不同。
向量类Vector扩充了数组的功能,提供了自动扩充数组长度、且把数组中原先存放的数据元素原样保存的功能。Vector类在java.util包中。

三、集合

集合(Set)是具有某种相似特性的事物的全体。换一种说法,也可以说,集合是某种具有相同数据类型的数据元素全体。
如果一个数据元素x在一个集合A中,则说数据元素x属于集合A;如果一个数据元素x不在一个集合A中,就说数据元素x不属于集合A。

如果集合A中的所有数据元素都在集合B中,则说集合B包含集合A。           
集合的运算主要有三种:两个集合的并A∪B、两个集合的交A∩B、两个集合的差A-B。
没有一个数据元素的集合称做空集合。

集合抽象数据类型:

数据集合:数据元素集合可以表示为{a0, a1, a2, ..., an-1},每个数据元素的数据类型可以是任意的类类型。
操作集合:
(1)添加add(obj):在集合中添加数据元素obj。
(2)删除remove(obj):删除集合中的数据元素obj。
(3)属于contain(obj):数据元素obj是否属于集合。是则返回true,否则返回false。
(4)包含include(otherSet):当前对象集合是否包含集合otherSet。是则返回true,否则返回false。
(5)相等eqauls(otherSet):当前对象集合是否和集合otherSet相等。是则返回true,否则返回false。
(6)数据元素个数size():返回集合中的数据元素个数。
(7)集合空否isEmpty():若集合空返回true,否则返回false。

集合类:

集合的特点是数据元素无序且不重复。集合类既可以基于向量类来实现,也可以用其他方法实现。常用的另一种实现方法是基于哈希表来实现。
基于向量类的集合类实现方法:
 1 MyVector类增加的成员函数         
 2 集合类MySet
 3 集合类MySet的测试

public interface Collection {

	//在指定位置增加元素
	public void add(int index,Object element) throws Exception;
	//在集合末端增加元素
	public void add(Object element) throws Exception;
	//在指定位置设置值
	public void set(int index,Object element) throws Exception;
	//得到指定位置的元素
	public Object get(int index) throws Exception;
	//删除指定位置的元素
	public void remove(int index) throws Exception;
	//删除该元素
	public void remove(Object element) throws Exception;
	//得到集合的大小
	public int size();
	//判断是否包含指定元素
	public boolean contain(Object element) throws Exception;
}

public class MyVector implements Collection{

	//对象数组
	private Object data[];
	//集合大小
	private int count;
	//集合默认大小
	private static final int defaultSize=10;
	
	private void init(int size) {
		this.count=0;
		data=new Object[size];
	}
	
	//默认无参数构造方法
	public MyVector() {
		init(defaultSize);
	}
	
	//制定集合大小的构造方法
	public MyVector(int size) {
		init(size);
	}
	
	//动态扩容
	private void ensureCapacity(int minCapacity) {
		int oldCapacity=data.length;
		if(minCapacity>oldCapacity) {
			Object[] oldData=data;
			int newCapacity=2*oldCapacity;
			if(newCapacity<minCapacity) {
				newCapacity=minCapacity;
			}
			data=new Object[newCapacity];
			System.arraycopy(oldData, 0, data, 0, count);
		}
	}
	
	
	@Override
	public void add(int index, Object element) throws Exception {
		if(index<0||index>=count+1) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
		ensureCapacity(count+1);
		//将index之后的元素向后移动一位,在index位置插入element
		System.arraycopy(data, index, data, index+1, count-index);
		data[index]=element;
		count++;
	}

	@Override
	public void add(Object element) throws Exception {
		add(count, element);
	}

	@Override
	public void set(int index, Object element) throws Exception {
		if(index<0||index>=count) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
		data[index]=element;
	}

	@Override
	public Object get(int index) throws Exception {
		if(index<0||index>=count) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
		return data[index];
	}

	//判断element在集合中的额位置,如果等于-1,则表示没有找到
	private int indexOf(Object element) {
		if(element==null) {
			for (int i = 0; i < count; i++) {
				if(data[i]==null)
					return i;
			}
		}else {
			for (int i = 0; i < count; i++) {
				if(data[i].equals(element))
					return i;
			}
		}
		
		return -1;
	}
	
	@Override
	public void remove(int index) throws Exception {
		if(index<0||index>=count) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
		//将index位置之后的所有元素复制并向钱移动一位,将最后的元素置为null,数组长度减一
		int j=count-index-1;
		if(j>0) {
			System.arraycopy(data, index+1, data, index, j);
		}
		count--;
		data[count]=null;
	}

	@Override
	public void remove(Object element) throws Exception {
		int index=indexOf(element);
		if(index>=0) {
			remove(index);
		}
	}

	@Override
	public int size() {
		return count;
	}

	@Override
	public boolean contain(Object element) throws Exception {
		return indexOf(element)>=0;
	}

	
}

public class MySet{
	
	private MyVector vector=new MyVector();
	
	public void add(Object element) throws Exception {
		//不能增加null
		if(element==null) 
			return;
		//不能增加重复元素
		if(!vector.contain(element))
			vector.add(element);
		else
			return;
	}
	
	public void remove(Object element) throws Exception{
		vector.remove(element);
	}
	
	public int size() {
		return vector.size();
	}
	
	public Object get(int index) throws Exception {
		return vector.get(index);
	}

	public boolean contain(Object element) throws Exception {
		return vector.contain(element);
	}
	
	public boolean isEmpty() {
		return vector.size()>0;
	}
	
	//判断一个元素是否是该集合的子集
	public boolean include(Object element) throws Exception {
		if(element instanceof MySet) {
			MySet set=(MySet) element;
			int count=0;
			while(count<set.size()) {
				Object temp=set.get(count);
				count++;
				if(!contain(temp)) {
					return false;
				}
			}
			return true;
		}
		return false;
	}
	
	//判断两个集合是否相等
	public boolean equals(Object element) {
		if(element instanceof MySet) {
			MySet set=(MySet) element;
			try {
				if(include(set)&&set.include(this))
					return true;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return false;
	}
	
}

public class Main {

	public static void main(String[] args) throws Exception {
		MyVector vector=new MyVector(10);
		for (int i = 0; i < 10; i++) {
			vector.add(i+1);
		}
		
		System.out.println(vector.size());
		System.out.println(vector.contain(new Integer(9)));//true
		System.out.println("动态增加第十一个元素...........");
		vector.add(11);
		System.out.println(vector.size());
		for (int i = 0; i < vector.size(); i++) {
			System.out.print(vector.get(i)+"  ");
		}
		
		System.out.println();
		vector.remove(4);
		System.out.println("删除index=4的元素............");
		for (int i = 0; i < vector.size(); i++) {
			System.out.print(vector.get(i)+"  ");
		}
		
	}
}

public class SetMain {

	public static void main(String[] args) throws Exception{
		MySet set1=new MySet();
		set1.add(1);
		set1.add(2);
		set1.add(3);
		set1.add(4);
		System.out.println(set1.size());//4
		set1.add(2);
		System.out.println(set1.size());//4
		set1.add(null);
		System.out.println(set1.size());//4
		set1.add(5);
		System.out.println(set1.size());//5
		
		MySet set2=new MySet();
		set2.add(1);
		set2.add(2);
		set2.add(3);
		System.out.println(set1.include(set2));//true
		
		set2.add(4);
		set2.add(5);
		System.out.println(set1.equals(set2));//true
	}
}


猜你喜欢

转载自blog.csdn.net/m0_37897502/article/details/78327704