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;
}
}
分享到:
相关推荐
这里的“行业分类-设备装置-对序列进行处理的装置和方法”主题涉及到了如何利用硬件设备和算法来有效地操作和分析一系列数据点。这种技术广泛应用于各种设备,如智能手机、物联网(IoT)设备、服务器以及各种传感器...
### Java常用类及集合操作详解 #### 一、Java常用类概述 在Java编程语言中,内置了许多实用的类,这些类提供了丰富的功能,能够帮助开发者高效地完成各种任务。本节将详细介绍其中的一些关键类及其用法。 ##### ...
综上所述,要理解并实现Android中Parcelable序列化自定义类集合在Activity间传递,开发者需要掌握Parcelable接口的使用、自定义类的Parcelable实现、集合处理、Intent数据传递,以及可能借助的源码阅读和辅助工具。...
3. **Collections**:Collections是Java提供的工具类,提供了对集合的各种操作,如排序(sort())、查找最大/最小元素(max()和min())以及二分查找(binarySearch())等。 此外,文件还涉及到了数据结构的基础知识...
集合主要分为三类:序列`Seq`、集`Set`以及映射`Map`。所有这些集合都扩展自`Iterable`特质,这意味着它们支持迭代操作。 #### 不可变与可变集合 Scala中的集合分为两大类:不可变集合(`immutable`)与可变集合...
Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等。Collection 接口没有实现类,因此需要通过其子接口来实现。 Set 是一个不能包含重复元素的集合,SortedSet 是一个按照升序...
本篇文章将深入探讨如何创建和使用C#操作工具类,并分享一些实用的类库,帮助开发者提高代码效率和可维护性。 首先,让我们了解如何创建一个基础的C#工具类。通常,工具类是以静态类的形式存在的,因为它们不需要...
同时,这个项目也可能涉及如何在ASP.NET窗体之间传递和恢复序列化的集合,以保持用户操作的状态。 在实际应用中,集合的序列化也常用于Web服务或分布式系统,其中对象需要跨进程或跨网络传递。例如,通过将集合序列...
ps:要想往集合中存放基本数据类型,必须转换为对应的包装类 Collection -- 集合接口 List -- List接口(添加了许多针对下标操作的方法) 特点:有序的,且可重复 ArrayList: 数据结构:一维数组 ...
4. **时间序列对象**:MATLAB提供`timeseries`类,用于创建和操作时间序列对象。这可能包括设置时间索引、数据值以及元数据。`mgts.m`可能创建了这样的对象,以便更好地管理和操作麦基玻璃的时间序列数据。 5. **...
类的成员变量可以是一个`std::vector<int>`,以方便进行集合操作。类的构造函数可以初始化为空集合,而析构函数则负责释放内存。 总之,这个项目是一个学习和实践C++集合操作和用户界面设计的好机会。通过数组实现...
Java集合可以分为两大类:Collection和Map。 Java集合的类型 Java集合有多种类型,常见的有ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。 * ArrayList:是一个基于数组的列表实现,支持随机...
在IT行业中,尤其是在Android开发领域,"sp缓存list集合工具类"是一个常见的概念,它涉及到数据存储和优化。SP通常指的是SharedPreferences,这是一种轻量级的数据存储方式,用于保存应用程序中的简单键值对数据,如...
4. **序列化配置**:Kryo提供了丰富的配置选项,如注册特定的序列化策略,控制序列化深度,以及选择是否保留对象的类信息等。 5. **兼容性**:尽管Kryo不是Java标准的序列化机制,但它可以与Java原生的序列化系统...
Set接口代表无序且不允许重复元素的集合,List接口则维护元素的顺序并允许重复,而Queue接口则用于处理基于先进先出(FIFO)原则的元素序列。 在Java 1.5引入的泛型使得集合框架更加安全和强大。使用泛型()可以在...
Java的标准库提供了ObjectOutputStream和ObjectInputStream类来处理序列化和反序列化操作。此外,Java还有许多第三方库,如Jackson和Gson,它们提供了更高级的功能,如XML和JSON的序列化。 在.NET框架中,有多种...
- **动态JSON**:使用`JObject`,`JArray`等动态类型,可以直接操作JSON而无需预先定义类。 - **JSON Schema验证**:可以验证JSON数据是否符合指定的JSON Schema。 提供的`Documentation.chm`可能是Json.NET的...