集合操作类--序列


package com.opensource.collections;

/**
* 对整数元素集合进行操作
* 使用序列的方式
* 使用数组实现,当元素数量大时,效率较低
*/
public class DoubleArraySeq implements Cloneable{

//DoubleArraySeq类不变式:
//1.序列中元素的数目存储在实例变量manyItems中。
//2.对于空序列,并不关心在任何data中存放了什么;对于
//一个非空序列,序列的元素存储在data[0]到data[manyItems-1],
//不需要关心data其他部分存放的是什么元素.
//3.如果有当前元素,那么它位于data[currentIndex],如果没有当前元素,
//则currentIndex等于manyItems.

private double[] data; //元素集合
private int manyItems; //元素数量
private int currentIndex; //当前元素(若存在)的下标值

/**
* 使用默认的10容量初始化一个空序列
*/
public DoubleArraySeq()
{
final int INITIAL_CAPACITY = 10;
manyItems = 0;
data = new double[10];
}

/**
* 使用指定大小初始化一个空包
* @param initialCapacity
*/
public DoubleArraySeq(int initialCapacity)
{
if(initialCapacity < 0)
throw new IllegalArgumentException
("initialCapacity is negative:"+initialCapacity);
manyItems = 0;
try
{
data = new double[initialCapacity];
}catch(OutOfMemoryError e){
throw new RuntimeException
("System have no enough memory");
}
}

/**
* 在当前元素前面增加元素
* @param element
*/
public void addBefore(double element)
{
if(manyItems == data.length)
{
ensureCapacity(manyItems*2+1);
}else{
if(isCurrent())
{
for(int i = manyItems ;i > currentIndex ; i--)
{
data[i] = data[i-1];
}
data[currentIndex] = element;
manyItems++;
}
else
{
for(int i = manyItems; i>0;i--)
{
data[i] = data[i-1];
}
data[0] = element;
manyItems++;
}
}
}

/**
* 在当前元素后面增加元素
* @param element
*/
public void addAfter(double element)
{

if(manyItems == data.length)
{
ensureCapacity(manyItems*2+1);

}else{
if(isCurrent())
{
for(int i = manyItems ;i > currentIndex+1 ; i--)
{
data[i] = data[i-1];
}
data[currentIndex+1] = element;
currentIndex +=1;
manyItems++;
}
else{
data[manyItems] = element;
manyItems++;
}
}
}
/**
* 判断序列是否有当前元素
* @return
*/
public boolean isCurrent()
{
if(currentIndex != manyItems)
return true;
else{
return false;
}
}

/**
* 获取当前元素值
* @return
*/
public double getCurrent()
{
if(isCurrent())
return data[currentIndex];
else
throw new IllegalArgumentException
("Do not exist current element");
}

/**
* 初始化序列的当前元素为0
*/
public void start()
{
currentIndex = 0;
}

/**
* 返回当前元素的数量
* @return
*/
public int size()
{
return manyItems;
}

/**
* 改变序列的容量
* @param minimumCapacity
*/
public void ensureCapacity(int minimumCapacity)
{
double[] biggerArray;
if(data.length < minimumCapacity)
{
biggerArray = new double[minimumCapacity];
System.arraycopy(data, 0, biggerArray, 0, manyItems);
data = biggerArray;
}
}

/**
* 删除当前元素
* @return
*/
public boolean removeCurrent()
{
if(isCurrent()){
if(currentIndex == manyItems-1)
{
manyItems -=1;
}else
{
for(int i= currentIndex;i<manyItems-1;i++)
{
data[i] = data[i+1];
}
manyItems--;
}
return true;
}
return false;
}

/**
* 将一个序列添加到现有序列的后面
* @param addend
*/
public void addAll(DoubleArraySeq addend)
{
//如果addend为null,那么将抛出NullPointerExceptino
//如果总项数超过Integer.MAX_VALUE,将会出现算术溢出并且包失败
ensureCapacity(manyItems+addend.manyItems);
System.arraycopy(addend.data, 0, data, manyItems, addend.manyItems);
manyItems += addend.manyItems;
}

/**
* 合并两个序列
* @param s1
* @param s2
* @return
*/
public static DoubleArraySeq concatenation(DoubleArraySeq s1,DoubleArraySeq s2)
{
DoubleArraySeq answer = new DoubleArraySeq(s1.getCapacity()+s2.getCapacity());
System.arraycopy(s1.data, 0, answer.data, 0, s1.manyItems);
System.arraycopy(s2.data, 0, answer.data, s1.manyItems, s2.manyItems);
answer.manyItems = s1.manyItems+s2.manyItems;
answer.currentIndex = answer.manyItems;

return answer;
}

/**
* 获取序列的容量
* @return
*/
public int getCapacity()
{
return data.length;
}

/**
* 使序列的下一个元素成为当前元素
*/
public void advance()
{
if(isCurrent())
currentIndex +=1;
}

/**
* 将该序列当前容量缩减到它的实际大小
*/
public void trimToSize()
{
double[] trimmedArray;
if(data.length != manyItems)
{
trimmedArray = new double[manyItems];
System.arraycopy(data, 0, trimmedArray, 0, manyItems);
data = trimmedArray;
}
}

/**
* 克隆序列的副本
*/
public Object clone()
{
//复制一个IntArrayBag对象
DoubleArraySeq answer=null;
try
{
answer = (DoubleArraySeq)super.clone();
}catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
answer.data = (double[])data.clone();

return answer;
}
}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值