package com.opensource.collections;
/**
* 对整数元素集合进行操作
* 使用数组实现,当元素数量大时,效率较低
*/
public class IntArrayBag implements Cloneable
{
//IntArrayBag类的不定式:
//1.包中元素的数目存放在实例变量manyItems中.
//2.对于一个空包,不需要关心存放的是什么数据,对于非空包,
//包中的元素存放在data[0]到data[manyItems-1]中,
//并且不需要关心data中其他部分的内容.
private int[] data; //元素集合
private int manyItems; //元素数量
/**
* 使用默认的10容量初始化一个空包
*/
public IntArrayBag()
{
final int INITIAL_CAPACITY = 10;
manyItems = 0;
data =new int[INITIAL_CAPACITY];
}
/**
* 使用指定大小初始化一个空包
* @param initialCapacity
*/
public IntArrayBag(int initialCapacity)
{
if(initialCapacity < 0)
throw new IllegalArgumentException
("initialCapacity is negative:"+initialCapacity);
manyItems = 0;
data = new int[initialCapacity];
}
/**
* 往包中添加元素
* @param element
*/
public void add(int element)
{
if(manyItems == data.length)
{
//将容量翻倍加1,即便manyItems为0也是如此。然而
//如果manyItems*2+1超过Integer.MAX_VALUE
//将会出现算术溢出并且包失败
ensureCapacity(manyItems*2+1);
}
data[manyItems] = element;
manyItems++;
}
/**
* 将另一个包的内容添加到该包中
* @param addend
*/
public void addAll(IntArrayBag addend)
{
//如果addend为null,那么将抛出NullPointerExceptino
//如果总项数超过Integer.MAX_VALUE,将会出现算术溢出并且包失败
ensureCapacity(manyItems+addend.manyItems);
System.arraycopy(addend.data, 0, data, manyItems, addend.manyItems);
manyItems += addend.manyItems;
}
/**
* 复制包对象
*/
public Object clone()
{
//复制一个IntArrayBag对象
IntArrayBag answer=null;
try
{
answer = (IntArrayBag)super.clone();
}catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
answer.data = (int[])data.clone();
return answer;
}
/**
* 计算包中特定元素出现次数
* @param target
* @return
*/
public int countOccurrences(int target)
{
int answer = 0;
for(int element:data)
{
if(element == target)
answer++;
}
return answer;
}
/**
* 改变包的容量
* @param minimumCapacity
*/
public void ensureCapacity(int minimumCapacity)
{
int[] biggerArray;
if(data.length < minimumCapacity)
{
biggerArray = new int[minimumCapacity];
System.arraycopy(data, 0, biggerArray, 0, manyItems);
data = biggerArray;
}
}
/**
* 获取该包的当前容量
* @return
*/
public int getCapacity()
{
return data.length;
}
/**
* 删除包中的目标元素,如果不存在,返回false
* @param target
* @return
*/
public boolean remove(int target)
{
int index; //target在data数组中的位置
//首先,将index设置成target在data数组中的位置
//最小可为0,最大可为manyItems-1.
//如果target不在数组中,那么将index设置成manyItesms;
index = 0;
while((index < manyItems) && (target != data[index]))
{
index++;
}
if(index == manyItems)
//没有找到target,所以没有删除任何内容
return false;
else
{
manyItems--;
data[index]=data[manyItems];
return true;
}
}
/**
* 获取包中的元素数量
* @return
* manyItems
*/
public int size()
{
return manyItems;
}
/**
* 将该包的当前容量减小成为它的实际大小
*/
public void trimToSize()
{
int[] trimmedArray;
if(data.length != manyItems)
{
trimmedArray = new int[manyItems];
System.arraycopy(data, 0, trimmedArray, 0, manyItems);
data = trimmedArray;
}
}
/**
* 合并两个包对象
* @param b1
* 包对象
* @param b2
* 包对象
* @return
* answer
*/
public static IntArrayBag union(IntArrayBag b1,IntArrayBag b2)
{
//如果b1或者b2为null,那么抛出NullPointerException.
//如果总项数超过Integer.MAX_VALUE,将会出现算术溢出并且包失败.
IntArrayBag answer = new IntArrayBag(b1.getCapacity()+b2.getCapacity());
System.arraycopy(b1.data, 0, answer.data, 0, b1.manyItems);
System.arraycopy(b2.data, 0, answer.data, b1.manyItems, b2.manyItems);
answer.manyItems = b1.manyItems+b2.manyItems;
return answer;
}
}
分享到:
相关推荐
本教程“02-Java基础(数组-常见操作-遍历)”将深入讲解Java数组的概念、创建、初始化以及如何进行遍历等核心知识点。 首先,数组是存储同一类型元素的固定大小的集合。在Java中,数组的声明语法如下: ```java 数据...
在Java编程语言中,数组是一种特殊的数据结构,用于存储同一类型的数据集合。在这个文档中,我们专注于一维数组的实例,主要探讨了如何创建、初始化和输出一维数组的元素。以下是详细的知识点解析: 1. **数组声明*...
在Objective-C中,字符串被封装在NSString类中,数组由NSArray和NSMutableArray类来管理,字典则由NSDictionary和NSMutableDictionary来实现,而集合则由NSSet和NSMutableSet来表示。此外,还提供了快速枚举等便捷的...
ArrayList是基于数组实现的,提供了添加、删除、查找等操作,适合频繁进行随机访问的场景。 5. **ArrayList与List接口**: - ArrayList是List接口的一个实现,List接口允许有重复元素,且是有序的。通过`add()`...
- Java提供了一个`Arrays`类,其中包含多种操作数组的方法,如`sort()`、`equals()`、`fill()`和`deepEquals()`等,方便对数组进行操作。 通过深入理解和熟练运用这些概念,开发者能够有效地管理和操作数据,实现...
数组实现中,可以通过遍历两个集合,逐一比较元素来计算这些集合操作。 6. **迭代器**:虽然数组自身没有内置迭代器,但可以自定义迭代器类来遍历集合中的所有元素。迭代器提供了一种高效访问集合的方式。 7. **...
5. **动态扩展**:Java中没有直接的动态扩展数组的操作,但可以通过创建新数组并复制旧数组内容实现类似功能。 五、数组与内存效率 数组在内存中是连续分配的,因此访问速度快。然而,如果数组过大,可能会导致内存...
数组和集合的操作在实际编程中至关重要,因为它们可以帮助你有效地组织和管理数据。例如,在处理用户输入、显示列表或者在游戏中存储角色状态时,都会用到这些概念。通过深入学习这部分内容,你可以提高E4A编程的...
数组在Java中是一种固定大小的数据结构,用于存储同类型元素的集合。ArrayTest.java和Array2Test.java可能是两个示例程序,演示了如何声明、初始化和操作数组。数组的使用包括创建数组、赋值、遍历以及数组方法如...
在Swift编程语言中,字典数组模型是一种常见的数据结构,用于处理和操作包含多个字典的数据集合。这种数据结构在iOS应用开发中尤其常见,特别是在处理JSON数据时,因为服务器通常返回字典形式的响应。本篇文章将深入...
数组是一种用于存储同类型元素的集合的数据结构。每个元素通过索引访问,索引通常从0开始。数组的大小在创建时确定,并且在程序执行过程中不可改变。数组的声明通常包含数组名和数组大小,例如: ```c int array[10...
这种方法适用于对象数组的深拷贝,因为集合框架中的copy()方法实现了深拷贝。 7. **自定义复制方法** 当需要进行特定的复制逻辑,如条件复制、只复制部分元素时,可以自定义复制方法。这种方式具有更高的灵活性,...
在Matlab中,三维数组和分类数组是两种重要的数据结构,它们在算法开发、数据可视化、数据...教程资源如"46 分类数组-修改分类数组-合并和删除类别.mp4"提供了详细的视频讲解,助你在掌握理论知识的同时提升实践技能。
### C#中的数组与集合类详解 #### 一、数组的概念与使用 在C#编程中,数组是一种非常重要的数据结构,它允许程序员以一种高效且有序的方式存储多个相同类型的数据项。数组不仅可以帮助简化代码,提高代码的可读性...
数组是编程中最常用的数据结构之一,用于存储有序集合。Objective-C提供了两个数组类:NSArray和NSMutableArray。NSArray用于创建不可变数组,而NSMutableArray则提供了修改数组内容的方法。以下是Objective-C中数组...
本案例将探讨如何在C++中创建一个类来管理数组,并实现打印数组的功能。让我们详细了解一下这个“cpp代码-打印数组(数组类案例)”。 首先,我们看到有一个名为`main.cpp`的文件,这是C++程序的入口点,通常包含...
集合类通常提供更丰富的接口和方法,如添加、删除、查找、遍历等,相比于数组更易于实现复杂的数据管理。 数组和集合在使用上各有优势。数组的访问速度快,内存占用小,适合固定大小的数据集合;而集合提供了更多的...
在给定的标题“dotnet-使用Linq筛选满足数组条件的List集合”中,我们主要关注如何利用Linq对List集合进行筛选,特别是基于某个数组条件。描述“Linq_List_Contrast_Baseon_Array 使用Linq筛选满足数组条件的List...