`
┿┅мīSS
  • 浏览: 96028 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

集合操作类--包(数组实现)

    博客分类:
  • J2SE
阅读更多

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基础(数组-常见操作-遍历

    本教程“02-Java基础(数组-常见操作-遍历)”将深入讲解Java数组的概念、创建、初始化以及如何进行遍历等核心知识点。 首先,数组是存储同一类型元素的固定大小的集合。在Java中,数组的声明语法如下: ```java 数据...

    Java中数组实例---一维数组.pdf

    在Java编程语言中,数组是一种特殊的数据结构,用于存储同一类型的数据集合。在这个文档中,我们专注于一维数组的实例,主要探讨了如何创建、初始化和输出一维数组的元素。以下是详细的知识点解析: 1. **数组声明*...

    Object-c字符串数组字典

    在Objective-C中,字符串被封装在NSString类中,数组由NSArray和NSMutableArray类来管理,字典则由NSDictionary和NSMutableDictionary来实现,而集合则由NSSet和NSMutableSet来表示。此外,还提供了快速枚举等便捷的...

    web程序设计-第4章数组与容器PPT课件.pptx

    ArrayList是基于数组实现的,提供了添加、删除、查找等操作,适合频繁进行随机访问的场景。 5. **ArrayList与List接口**: - ArrayList是List接口的一个实现,List接口允许有重复元素,且是有序的。通过`add()`...

    JavaSE进阶-02-数组.pdf

    - Java提供了一个`Arrays`类,其中包含多种操作数组的方法,如`sort()`、`equals()`、`fill()`和`deepEquals()`等,方便对数组进行操作。 通过深入理解和熟练运用这些概念,开发者能够有效地管理和操作数据,实现...

    C++集合类的编写,用数组实现的

    数组实现中,可以通过遍历两个集合,逐一比较元素来计算这些集合操作。 6. **迭代器**:虽然数组自身没有内置迭代器,但可以自定义迭代器类来遍历集合中的所有元素。迭代器提供了一种高效访问集合的方式。 7. **...

    03-Java基础(数组-内存空间的划分

    5. **动态扩展**:Java中没有直接的动态扩展数组的操作,但可以通过创建新数组并复制旧数组内容实现类似功能。 五、数组与内存效率 数组在内存中是连续分配的,因此访问速度快。然而,如果数组过大,可能会导致内存...

    E4A易安卓视频教程源码: - 06、数组和集合.rar

    数组和集合的操作在实际编程中至关重要,因为它们可以帮助你有效地组织和管理数据。例如,在处理用户输入、显示列表或者在游戏中存储角色状态时,都会用到这些概念。通过深入学习这部分内容,你可以提高E4A编程的...

    JavaSE基础篇 -- jdk配置,数组及其应用,栈和堆内存图解(Java源码)

    数组在Java中是一种固定大小的数据结构,用于存储同类型元素的集合。ArrayTest.java和Array2Test.java可能是两个示例程序,演示了如何声明、初始化和操作数组。数组的使用包括创建数组、赋值、遍历以及数组方法如...

    Swift-model(字典数组模型)

    在Swift编程语言中,字典数组模型是一种常见的数据结构,用于处理和操作包含多个字典的数据集合。这种数据结构在iOS应用开发中尤其常见,特别是在处理JSON数据时,因为服务器通常返回字典形式的响应。本篇文章将深入...

    C语言入门-数据类型、数组和函数介绍.pdf

    数组是一种用于存储同类型元素的集合的数据结构。每个元素通过索引访问,索引通常从0开始。数组的大小在创建时确定,并且在程序执行过程中不可改变。数组的声明通常包含数组名和数组大小,例如: ```c int array[10...

    java高端技术课程--Java数组如何实现复制

    这种方法适用于对象数组的深拷贝,因为集合框架中的copy()方法实现了深拷贝。 7. **自定义复制方法** 当需要进行特定的复制逻辑,如条件复制、只复制部分元素时,可以自定义复制方法。这种方式具有更高的灵活性,...

    matlab 三维 数组 分类数组-修改分类数组-合并和删除类别 算法开发、数据可视化、数据分析以及数值计算 Matlab课程

    在Matlab中,三维数组和分类数组是两种重要的数据结构,它们在算法开发、数据可视化、数据...教程资源如"46 分类数组-修改分类数组-合并和删除类别.mp4"提供了详细的视频讲解,助你在掌握理论知识的同时提升实践技能。

    C#中的数组与集合类,vusual studio 2008教程

    ### C#中的数组与集合类详解 #### 一、数组的概念与使用 在C#编程中,数组是一种非常重要的数据结构,它允许程序员以一种高效且有序的方式存储多个相同类型的数据项。数组不仅可以帮助简化代码,提高代码的可读性...

    Objective-C数组操作总结

    数组是编程中最常用的数据结构之一,用于存储有序集合。Objective-C提供了两个数组类:NSArray和NSMutableArray。NSArray用于创建不可变数组,而NSMutableArray则提供了修改数组内容的方法。以下是Objective-C中数组...

    cpp代码-打印数组 (数组类案例)

    本案例将探讨如何在C++中创建一个类来管理数组,并实现打印数组的功能。让我们详细了解一下这个“cpp代码-打印数组(数组类案例)”。 首先,我们看到有一个名为`main.cpp`的文件,这是C++程序的入口点,通常包含...

    数组和集合

    集合类通常提供更丰富的接口和方法,如添加、删除、查找、遍历等,相比于数组更易于实现复杂的数据管理。 数组和集合在使用上各有优势。数组的访问速度快,内存占用小,适合固定大小的数据集合;而集合提供了更多的...

    dotnet-使用Linq筛选满足数组条件的List集合

    在给定的标题“dotnet-使用Linq筛选满足数组条件的List集合”中,我们主要关注如何利用Linq对List集合进行筛选,特别是基于某个数组条件。描述“Linq_List_Contrast_Baseon_Array 使用Linq筛选满足数组条件的List...

Global site tag (gtag.js) - Google Analytics