集合----顺序存储的实现
来源:互联网 发布:少女时代减肥 知乎 编辑:程序博客网 时间:2024/05/01 04:14
一 、集合的定义
集合是由任意类型互不相同的数据元素组成的,它们之间没有任何逻辑关系。每一个元素都是相对独立的。在Java中,Object类是所有对象的根类,可以代表集合中任意一种数据类型。在Java中,Set接口来表示集合。集合分为顺序存储结构和链式存储结构,顺序结构是由数组来实现的,本博客讲述顺序存储结构相关代码的实现。
二、集合的抽象数据类型
抽象数据类型(ADT)包括数据和操作两个部分,数据也为一个集合,采用任意方式存储,操作指的就是方法。抽象数据类型定义如下:
ADT Set is
Data :
采用顺序结构存储
Operation:
initSet(); //创建一个集合并初始化为空集
add(obj); //想集合中插入一个元素
remove(obj); //从集合中删除指定的元素
contains(obj); //判断一个给定元素是否包含集合
value(i); //返回集合中第i个元素的值
find(obj); //从集合中按值查找并返回
size(); //求出元素中集合的个数
isEmpty(); //判断集合是否为空
output(); //输出集合中所有的元素
union(set); //求当前集合与参数集合set的并集并返回
intersection(set); //求当前集合与参数集合set的交集并返回
clear(); //清楚集合中的所有元素,使之变为空集
end Set
三 、操作的具体实现
1. 定义一个类SequenceSet,初始化集合为空
public class SequenceSet { private int maxSize = 10; //定义数组的初始长度为10 private Object[] setArray; //定义存储集合的数组 private int length; //定义数组中所保存集合元素的个数 public SequenceSet(){ //无参构函数 length = 0; //集合初始为空,长度为0 setArray = new Object[maxSize]; //定义长度为maxSize的数组 } public SequenceSet(int n){ //带初始长度的构造函数的定义 if(n<=0){ System.out.println("数组的长度要大于0,已退出运行!"); System.exit(1); } length = 0; //集合初始为空,长度为0 setArray = new Object[n]; //定义长度为n的数组 }}
2. 向集合中插入一个元素
- 顺序查找集合中是否存在值为待插入值为obj的元素,若存在则不能插入,返回false,因为集合中不能存在相同的元素。
- 检查数组长度是否够用,若不够用则创建一个新的数组,然后把原来的数组复制到新数组中,最后把新数组赋值给原来的数组。
- 把obj的值插入到保存集合的后面的一个空位置上。
- 集合的长度加1。
- 插入成功返回true。
public boolean add(Object obj){ //判断元素是否存在,若存在则返回false for (int i = 0; i < length; i++) { if(setArray[i].equals(obj)) return false; } //如果数组的长度已经分配完,需要在创建一个新的数组,并且把setArray的内容复制到新数组中,然后进行赋值。 if(setArray.length == length){ Object[] temp = new Object[length*2+1]; System.arraycopy(setArray, 0, temp, 0, length); setArray = temp; } //增加元素,长度加1 setArray[length] = obj; length++; return true; }
3.从集合中删除一个元素
- 首先遍历数组,查找等于给定obj的元素
- 若存在则删除,把空出的位置让最后一个元素填充,length减1,返回true。
- 若不存在,则返回false,原集合的元素不变
public boolean remove(Object obj){ for (int i = 0; i < length; i++) { //遍历数组 if(setArray[i] == obj){ //如果存在相等元素,则将最后一个元素赋给删除的元素,长度减1 setArray[i] = setArray[length-1]; length--; return true; } } return false; }
4.判断一个元素是否属于该集合
public boolean contains(Object obj){ //遍历数组,如存在相等的元素则返回true for (int i = 0; i < length; i++) { if(setArray[i].equals(obj)) return true; } return false; }
5.返回集合中第i个元素
public Object value(int i){ if(i<=0||i>length){ System.out.println("i应该在1和length之间!"); System.exit(1); } return setArray[i-1]; //返回第i个位置,对应下标为i-1 }
6.从集合中按值查找元素
public Object find(Object obj){ //若集合中存在该元素,则返回obj,否则返回null for (int i = 0; i < length; i++) { if(setArray[i].equals(obj)) return obj; } return null; }
7.返回集合的长度
public int size(){ return length; }
8.判断集合是否为空
public boolean isEmpty(){ return length==0; //只需判断长度是否为0即可 }
9.输出集合中所有的元素
public void output(){ for (int i = 0; i < length; i++) { System.out.println(setArray[i].toString()); } System.out.println(); }
10.求两个集合的并集
public SequenceSet union(SequenceSet set){ //遍历当前集合中所有的元素 for (int i = 0; i < length; i++) { //向set集合中添加当前元素 set.add(setArray[i]); } //返回并集集合,即set集合 return set; }
11.求两个集合的交集
public SequenceSet intersection(SequenceSet set){ //求两个集合的最小长度 int minLength; if(length<set.length){ minLength = length; }else{ minLength = set.length; } //创建一个SequenceSet对象,用作存放两个集合的交集 SequenceSet tempSet = new SequenceSet(minLength); //遍历当前集合中的每一个元素 for (int i = 0; i < length; i++) { Object x= setArray[i]; //判断set集合是否包含该元素 boolean b =set.contains(x); //如果包含当前集合中的该元素,则存入tempSet中,然后长度加1 if(b){ tempSet.setArray[tempSet.length++] = x; } } return tempSet; }
12.清空集合中的元素
public void clear(){ length = 0; }
三、总结
看完这篇文章大家对顺序结构应该有了清楚的认识了,顺序结构的底层实现是数组,然而数组的长度是不可变的,所有出现了扩容的情况,下次我们将讲述集合的另一种实现方式–链表。上面的代码大家应该手动敲一遍,你会有很大收获。学无止境,加油吧,少年!
- 集合----顺序存储的实现
- 集合的顺序存储及操作实现
- 集合顺序存储结构的实现和操作
- 栈的顺序存储实现
- 栈的顺序存储实现
- 栈的顺序存储实现
- 栈的顺序存储实现
- 栈的顺序存储实现
- 栈的顺序存储实现
- 栈的顺序存储实现
- 队列的顺序存储实现
- 顺序存储与链式存储的集合-HashMap、HashTable
- 集合----链式存储的实现
- 顺序表实现两个集合的合并
- 线性结构的顺序存储的实现
- 栈的顺序存储结构的实现
- c数据结构的顺序存储的实现
- 线性表的顺序存储的实现
- 5、隐藏实施过程
- 杭电-1301 Jungle Roads (kruskal)
- HDOJ 1236 排名
- 【zzuliOJ】1896 - 985的买饮料难题(贪心)
- android studio recyclerview长按删除
- 集合----顺序存储的实现
- PostConstruct
- 组内挑战赛:Lab 3
- 【大话数据结构&算法】快速排序算法(Java/C实现源码)
- 基于ViewHolder优化的BaseAdapt
- 利用jQuery的$.event.fix函数统一浏览器event事件处理
- coco2dx对象统计及内存查漏
- 排序序列之直接插入排序与希尔排序
- PAT-A 1037. Magic Coupon