集合的抽象数据类型采用Java中的接口来描述。定义如下:
piblic interface Set
{
boolean add(Object obj); //向集合中插入一个元素obj
boolean remove(Object obj); //从集合中删除一个元素obj
boolean contains(Object obj); //判断一个元素obj是否属于集合
Object value(int i); //返回集合中第i个元素的值
Object find(Object obj); //从集合中按值obj查找元素并返回
int size(); //求出集合中元素的个数
boolean isEmpty(); //判断集合是否为空
void output(); //输出集合中所有元素
Set union(Set set); //求当前集合与参数集合set的并集并返回
Set intersection(Set set); //求当前集合与参数集合set的交集并返回
void clear(); //清除集合中所有元素,并使之变为空集
}
一般来说,数据结构都分为两种存储方式:顺序存储和链接存储。后面的文章中我们介绍其他数据结构的时候也会分为这两种情况。
1.集合的顺序存储结构和操作实现如下:
public class SequenceSet implements Set
{
final int minSize=10; //数组初始长度
private Object[] setArray; //数组声明
private int len; //保存集合当前的长度
public SequenceSet() //无参构造方法定义
{
len=0;
setArray=new Object[minSize];
}
public SequenceSet(int n) //带数组长度参数构造方法定义
{
if(n<minSize) n=minSize;
len=0;
setArray=new Object[n];
}
public boolean add(Object obj)
{
for(int i=0;i<len;i++)
if(setArray[i].equals(obj)) retrun false;
if(len==setArray.length){
Object[] p=new Object[len*2];
for(int i=0;i<len;i++) p[i]=setArray[i];
setArray=p;
}
setArray[len]=obj;
len++;
return true;
}
public boolean remove(Object obj)
{
itn i;
for(i=0;i<len;i++)
if(setArray[i].equals(obj)) break;
if(i<len){
setArray[i]=setArray[len-1];
len--;
return true;
}
else return false;
}
public boolean contains(Object obj)
{
for(int i=0;i<le;i++)
{
if(setArray[i].equals(obj)) return true;
}
return false;
}
public Object value(int i)
{
if(i<0||i>len)
{
System.out.println("输入参数i数值有误,应在1和"+len+"之间!");
System.exit(1);
}
return setArray[i-1];
}
public Object find(Object obj)
{
for(int i=0;i<len;i++)
if(setArray[i].equals(obj)) return setArray[i];
return null;
}
public int size() {return len;}
public boolean isEmpty(){return len==0;}
public void output()
{
for(int i=0;i<len;i++)
System.out.println(setArray[i].toString());
System.out.println();
}
public Set union(Set set)
{
SequenceSet dset=(SequenceSet)set;
SequceceSet setTemp=new SequenceSet(len+dset.len);
int i;
for(i=0;i<len;i++)
setTemp.setArray[i]=setArray[i];
setTemp.len=len;
for(i=0;i<dset.len;i++)
{
Object x=dset.setArray[i];
boolean b=contains(x);
if(!b) setTemp.setArray[setTemp.len++]=x;
}
return setTemp;
}
public Set intersection(Set set)
{
Sequence dset=(SequenceSet)set;
int c;
if(len<dset.len) c=len;else c=dset.len;
SequenceSet setTemp=new SequenceSet(c);
for(int i=0;i<dest.len;i++)
{
Object x=dset.setArray[i];
boolean b=contains(x);
if(b) setTemp.setArray[setTemp.len++]=x;
}
return setTemp;
}
public void clear()
{
len=0;
}
}
主类程序调试如下:
public class Example
{
public static void main(String[] args)
{
Set set1=new SequenceSet(10);
int[] a={20,16,38,42,29};
for(int i=0;i<a.length;i++) set1.add(a[i]);
Set set2=new SequenceSet();
set2.add(16); set2.add(29); set2.add(35);
Set set3;
set3=set1.union(set2);
set3.output();
Set set4;
set=set1.intersection(set2);
set4.output();
set1.remove(new Integer(16));
set1.output();
System.out.println("set1集合长度:"+set1.size());
boolean bb=set1.contains(29);
if(bb) System.out.println("set1 contains "+29);
}
}
程序运行结果:
20
16
38
42
29
35
16
29
20
29
38
42
set1的集合长度:4
set1 contains 29
2.集合的链接存储结构和操作实现如下:
结点类:
public class Node
{
Object element;
Node next;
public Node(Node nt) {next=nt;}
public Node(Object obj,Node nt)
{
element=obj;next=nt;
}
}
实现:
public class LinkSet implements Set
{
private Node head;
private int len;
public LinkSet()
{
len=0;
head=new Node(null);
}
public boolean add(Object obj)
{
Node p=head;
while(p.next!=null){
if(p.next.element.equals(obj)) return false;
else p=p.next;
}
p.next=new Node(obj,null);
len++;
return true;
}
public boolean remove(Object obj)
{
Node p=head;
while(p.next!=null)
if(p.next.element.equals(obj)) break;
else p=p.next;
if(p.next!=null){
p.next=p.next.next;
len--;
return true;
}
else return false;
}
public boolean contains(Object obj)
{
Node p=head.next;
while(p!=null){
if(p.element.equals(obj)) return true;
else p=p.next;
}
return false;
}
public Object value(int i)
{
if(i<=0||i>len){
System.out.println("参数i值有误,应该在1和"+len+"之间!");
System.exit(1);
}
int c=1;
Node p=head.next;
while(p!=null)
if(c==i) break; else {c++;p=p.next;}
return p.element;
}
public Object find(Object obj)
{
Node p=head.next;
while(p!=null)
{
if(p.element.equals(obj)) return p.element;
else p=p.next;
}
return null;
}
public int size() {return len;}
public boolean idEmpty() {return len==0;}
public void output()
{
Node p=head.next;
while(p!=null){
System.out.println(p.element.toString());
p=p.next;
}
System.out.println();
}
public Set union(Set set)
{
LinkSet setTemp=new LinkSet();
Node p=head.next;
Node q=setTemp.head;
while(p!=null){
Node r=new Node(p.element,null);
p=p.next;
q.next=r;
q=r;
}
setTemp.len=len;
LinkSet dset=(LinkSet)set;
p=dset.head.next;
while(p!=null){
Object x=p.element;
boolean b=contains(x);
if(!b){
q.next=new Node(x,null);
q=q.next;
setTemp.len++;
}
p=p.next;
}
return setTemp;
}
public Set intersection(Set set)
{
LinkSet setTemp=new LinkSet();
LinkSet dset=(LinkSet)set;
Node p=dset.head.next;
Node q=setTemp.head;
while(p!=null){
Object x=p.element;
boolean b=contains(x);
if(b){
q.next=new Node(x,null);
q=q.next;
setTemp.len++;
}
p=p.next;
}
return setTemp;
}
public void clear()
{
len=0;
head.next=null;
}
主类程序调试如下:
public class Example
{
public static void main(String[] args)
{
Set set1=new LinkSet(10);
int[] a={20,16,38,42,29};
for(int i=0;i<a.length;i++) set1.add(a[i]);
Set set2=new LinkSet();
set2.add(16); set2.add(29); set2.add(35);
Set set3;
set3=set1.union(set2);
set3.output();
Set set4;
set=set1.intersection(set2);
set4.output();
set1.remove(new Integer(16));
set1.output();
System.out.println("set1集合长度:"+set1.size());
boolean bb=set1.contains(29);
if(bb) System.out.println("set1 contains "+29);
}
}
结果与顺序存储结构中的调试类运行结果相同。
(完)
转载于:https://blog.51cto.com/secondscript/1598105