集合
来源:互联网 发布:修改数据库字段 编辑:程序博客网 时间:2024/05/16 15:25
一、集合的定义
集合的定义:集合是集合结构的简称,它是有同一类型的互不相同的数据元素聚集而成,元素之间不存在任何逻辑依赖关系。例如:{ a1,a2,a3,a4,a5,......an}
集合长度:数据元素的个数。
二、集合存储结构和实现
2.1顺序存储结构和操作实现
在一块存储空间内连续存储集合中的每个元素
在一块存储空间内连续存储集合中的每个元素
定义集合接口—》实现接口类—》实现接口中的方法。
public interface Set {boolean add(Object obj); //向集合中插入一个元素boolean remove(Object obj); //从集合中删除一个元素boolean contains(Object obj); //判断元素obj是否属于集合Object value(int i); //返回集合中第i个元素的值Object find(Object obj); //查找元素并返回int size(); //返回集合中元素的个数boolean isEmpty(); //判断集合是否为空void output(); //输出集合中的元素Set union(Set set); //返回当前集合和参数集合set的并集Set intersection(Set set); //返回当前集合和参数集合set的交集void clear(); //清除集合中的所有元素,返回空集}
实现接口Set的顺序集合类的定义
和接口中各个方法的具体操作实现
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)){return 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) { int i;for(i=0;i<len;i++){if(setArray[i].equals(obj))break;}if(i<len){//把集合中最后一个元素赋给被删除元素位置setArray[i]=setArray[len-1];len--;return true;}elsereturn false;}//判断元素obj是否属于集合public boolean contains(Object obj) { for(int i=0;i<len;i++){if(setArray[i].equals(obj)){return true;}}return false;}//返回集合中第i个元素的值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 obj;}}return null;}//返回集合中元素的个数public int size() { return len;}//判断集合是否为空public boolean isEmpty() { if(len==0){return true;}return false;}//输出集合中的元素public void output() {for(int i=0;i<len;i++){System.out.println(setArray[i].toString());}System.out.println();} //返回当前集合和参数集合set的并集public Set union(Set set) { //把参数转换为顺序集合类SequenceSet dset=(SequenceSet)set;//定义新集合SequenceSet setTemp=new SequenceSet(len+dset.len);int i;for(i=0;i<len;i++){setTemp.setArray[i]=setArray[i];}setTemp.len=len;//向新集合中依次插入dset中的元素for(i=0;i<dset.len;i++){Object x=dset.setArray[i];//从当前集合中找元素x,是否存在boolean b=contains(x);if(!b){setTemp.setArray[setTemp.len]=x;}}//返回新集合return setTemp;}//返回当前集合和参数集合set的交集public Set intersection(Set set) { SequenceSet dset=(SequenceSet)set;int newLen;if(len<dset.len){newLen=len;}else{newLen=dset.len;}//定义新的集合SequenceSet setTemp=new SequenceSet(newLen);for(int 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 void clear() {len=0;} }
2.2 链接存储结构和操作实现
结点类的定义
public class Node {Object element; //数值域Node next; //指针域public Node(Node nt) //只对next赋值{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; //集合初始长度为0 head=new Node(null); //初始建立由head指向的附加头结点,next域为空 //表示初始为一个空链表}//向集合中插入一个元素public boolean add(Object obj) {//把元素obj插入到链表尾Node p=head; //表头指针赋给临时引用对象while(p.next!=null){if(p.next.element.equals(obj)){return false; //元素已存在,无法插入}else{p=p.next; //修改p,使他指向后继结点}}p.next=new Node(obj,null); //在集合末尾插入新元素len++; //集合长度加1return true; }//从集合中删除一个元素public boolean remove(Object obj) { //从集合中删除一个元素为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--; //链表长度减1return true;}else{return false;}}//判断元素obj是否属于集合public boolean contains(Object obj) { Node p=head;while(p.next!=null){if(p.next.element.equals(obj)){return true;}else{p=p.next;}}return false;}//返回集合中第i个元素的值public Object value(int i) {if(i<0||i>len){System.out.println("参数i值有误!应在1和"+len+"之间");System.exit(1);}Node p=head;int c=1;while(p.next!=null){if(c==i){break;}else{c++;p=p.next;}}Object obj=p.element;return obj; }//查找元素并返回public Object find(Object obj) { Node p=head;while(p.next!=null){if(p.next.element.equals(obj)){return p.next.element;}else{p=p.next;}}return null;}//返回集合中元素的个数public int size() {return len; }//判断集合是否为空public boolean isEmpty() { return len==0;}//输出集合中的元素public void output() {Node p=head;while(p.next!=null){System.out.println(p.next.element.toString());p=p.next;}} //返回当前集合和参数集合set的并集public Set union(Set set) {LinkSet setTemp=new LinkSet(); //初始化保存并集的新链接集合为空Node p=head.next; //p初始指向当前链表的表头结点Node q=setTemp.head; //q初始指向并集新链表的附加表头结点while(p!=null){Node r=new Node(p.element,null); //根据p结点的值建立r新结点q.next=r; //把r结点链接到新链表的表尾q=r; //使q指向新链表的表尾结点p=p.next; //使p指向下一个待处理的结点}setTemp.len=len; //置新链表集合的长度LinkSet dset=(LinkSet)set; //把参数集合转换为链表集合p=dset.head.next; //让p指向参数链表的表头结点while(p!=null) //向新链表中依次插入参数链表中的每个结点值{Object x=p.element; //将结点的值赋给xboolean b=contains(x); //从当前集合中查找值为x的结点if(!b) //条件成立,表明x不在集合中,插入集合{q.next=new Node(x,null); //建立值为x的结点,插入到并集链表的末尾q=q.next; //使q指向新的表尾结点setTemp.len++; //新链表长度加1}p=p.next;}return setTemp; }//返回当前集合和参数集合set的交集public Set intersection(Set set) {LinkSet setTemp=new LinkSet(); //初始化保存交集的新连接集合为空LinkSet dset=(LinkSet)set; //把参数集合转换为链接集合Node p=dset.head.next; //p初始指向参数链表中的表头结点Node q=setTemp.head; //q初始指向交集新链接集合的附加头结点while(p!=null) //遍历参数链表中的每个结点{Object x=p.element; //将结点的值赋给xboolean b=contains(x); //从当前集合中查找值为x的结点if(b) //条件成立,表明x为交集中的元素{q.next=new Node(x,null); //建立值为x的结点,插入到交集链表的末尾q=q.next; //使q指向新的表尾结点setTemp.len++;}p=p.next; //使p指向参数链表中的下一个结点}return setTemp; }//清除集合中的所有元素,返回空集public void clear() {len=0;head.next=null;} }
阅读全文
0 0
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 趣图:Tomcat 遇到罕见的异常
- 面对人工智能,你还在恐惧自己的零基础吗?
- 序章
- Android内存泄露原因
- 如何将微信素材库的文章保留格式的复制到自己的博客论坛或者其他素材库
- 集合
- 安卓学习建议
- hdoj 5536 Chip Factory
- spring+springmvc+mybatis框架搭建总结
- RSM Surrogate model methods examples
- IDEA创建maven项目
- WPA2(wifi) 漏洞和攻击脚本 Key Reinstallation Attacks Breaking WPA2 by forcing nonce reuse
- Numpy
- linux 驱动