`
woxiaoe
  • 浏览: 284560 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Bag的实现续

阅读更多

Bag的实现续,实现了迭代的功能

package com.woxiaoe.collection;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class EBag<T> implements Collection<T>{
	private int bagSize = 0;//大小
	private T[] bagArray;//数组
	
	public EBag(int capacity) {
		bagArray = (T[]) new Object[capacity];
	}
	
	/**
	 * 添加一个对象,如果bag已经满了,者返回false
	 */
	public boolean add(T e) {
		if(size() < bagArray.length){
			bagArray[bagSize ++ ] = e;
			return true;
		}
		return false;
	}

	@Override
	public boolean addAll(Collection<? extends T> c) {
		//容量超出 返回fase
		boolean flag = false;
		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
			T t = (T) iterator.next();
			flag = true;
			add(t);
		}
		return flag;
	}

	@Override
	public void clear() {
		bagSize = 0;
		
	}

	@Override
	public boolean contains(Object o) {
		for(int i = 0; i < bagSize; i++){
			if(bagArray[i].equals(o)){
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean containsAll(Collection<?> c) {
		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
			if(!contains(object)){
				return false;
			}
		}
		return true;
	}

	@Override
	public boolean isEmpty() {
		
		return bagSize == 0?false:true;
	}

	@Override
	public Iterator<T> iterator() {
		return new Iteratorimpl();
	}

	@Override
	public boolean remove(Object o) {
		for(int i = 0; i < bagSize; i++){
			if(bagArray[i].equals(o)){
				remove(i);
				return true;
			}
		}
		return false;
	}
	public boolean remove(int index){
		if(index >= size()){
			return false;
		}
		for(int i = index;i<size() - 1;i++){
			bagArray[i] = bagArray[i+1];
		}
		bagSize -=1;
		return true;
	}
	@Override
	public boolean removeAll(Collection<?> c) {
		boolean flag = false;
		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
			if(remove(object)){
				flag = true;
			}
		}
		return flag;
	}

	@SuppressWarnings("unchecked")
	@Override
	public boolean retainAll(Collection<?> c) {
		boolean flag = false;
		T[] newArray = (T[]) new Object[bagSize];
		int index = 0;
		for(int i = 0; i < bagSize; i++){
			if(c.contains(bagArray[i])){//如果不包含这个元素,删除
				newArray[index ++] = bagArray[i];
				flag = true;
			}
		}
		if(flag){
			bagArray = newArray;
			bagSize = index;
		}
		return flag;
	}

	@Override
	public int size() {
		return bagSize;
	}

	@Override
	public Object[] toArray() {
		Object[] array = new Object[bagSize];
		System.arraycopy(bagArray, 0, array, 0, bagSize);
		return array;
	}

	@Override
	public <T> T[] toArray(T[] a) {
		T[] array = (T[]) new Object[bagSize];
		System.arraycopy(bagArray, 0, array, 0, bagSize);
		return array;
	}
	public void addAll(T[] array){
		int len = array.length;
		for (int i = 0; i < len; i++) {
			T t = array[i];
			add(t);
		}
	}
	@Override
	public String toString() {
		StringBuffer str = new StringBuffer("");
		if(this == null){
			return "null";
		}
		if(size() == 0){
			return "[]";
		}
		str.append("[" + bagArray[0]);
		for(int i = 1; i < bagSize; i++){
			str.append("," + bagArray[i]);
		}
		str.append("]");
		return str.toString();
	}
	/**
	 * 合并
	 * @param <T>
	 * @param bag1
	 * @param bag2
	 * @return
	 */
	public static <T> EBag<T> union(EBag<T> bag1,EBag<T>bag2){
		EBag<T> unionBag = new EBag<T>(bag1.size() + bag2.size());//
		T[] array = (T[]) new Object[bag1.size() + bag2.size()];
		System.arraycopy(bag1.toArray(), 0, array, 0, bag1.size());
		System.arraycopy(bag2.toArray(), 0, array, bag1.size(), bag2.size());
		unionBag.addAll(array);
		return unionBag;
	}
	/**
	 * 求交集
	 * @param <T>
	 * @param bag1
	 * @param bag2
	 * @return
	 */
	public static <T> EBag<T> intersection(EBag<T> bag1,EBag<T>bag2){
		EBag<T> intersectionBag = new EBag<T>(bag1.size()>= bag2.size()?bag2.size():bag1.size());//以bag1 和 bag2中大的值为新数组长度
		Set<T> set = new HashSet<T>();
		T[] array1 = (T[]) bag1.toArray();
		T[] array2 = (T[])bag2.toArray();
		int a1 = array1.length;
		int a2 = array2.length;
		for(int i = 0; i < a1; i++){
			set.add(array1[i]);
		}
		for(int i = 0; i < a2; i++){
			if(set.contains(array2[i])){//相同存入集合
				intersectionBag.add(array2[i]);
			}
		}
		return intersectionBag;
	}
	/**
	 * bag1 - bag2
	 * @param <T>
	 * @param bag1
	 * @param bag2
	 * @return
	 */
	public static <T> EBag<T> difference(EBag<T> bag1,EBag<T> bag2){
		EBag<T> differentBag = new EBag<T>(bag1.size() > bag2.size()?bag1.size():bag2.size());
		Set<T> set = new HashSet<T>();
		T[] array1 = (T[]) bag1.toArray();
		T[] array2 = (T[])bag2.toArray();
		differentBag.addAll(array1);
		int a1 = array1.length;
		int a2 = array2.length;
		for(int i = 0; i < a1; i++){
			set.add(array1[i]);
		}
		for(int i = 0; i < a2; i++){
			if(set.contains(array2[i])){//取出bag1中和bge2相同的
				differentBag.remove(array2[i]);
			}
		}
		return differentBag;
	}
	
	private  class Iteratorimpl implements Iterator<T>{
		private int nextIndex = 0;//下一个元素的标记
		private int latestIndex = -1;//最流行元素的下标
		@Override
		public boolean hasNext() {
			return nextIndex != bagSize;
		}

		@Override
		public T next() {
			latestIndex = nextIndex;
			nextIndex ++;
			return bagArray[latestIndex];
		}

		@Override
		public void remove() {
			if( latestIndex == -1){
				throw new RuntimeException("删除出错");
			}
			EBag.this.remove(bagArray[latestIndex]);
			latestIndex = -1;
			nextIndex --;
		}
		
	}
}
 
分享到:
评论

相关推荐

    BOW(Bag of words,词袋)模型代码实现

    **正文** 在计算机视觉领域,BOW(Bag of Words,词袋模型)是一种广泛应用的图像...在给定的“Bag-of-visual-words”文件中,可能包含了实现这一过程的代码和示例,供学习者理解和实践BOW模型在SIFT特征上的应用。

    python rosbag 模块

    10. ** ROS版本兼容性**:不同的ROS版本可能对rosbag有略微不同的实现,因此在不同版本间迁移时,需要确保bag文件的兼容性。 总的来说,Python的rosbag模块是ROS系统中不可或缺的一部分,它提供了强大的数据记录和...

    bag解压工具中文简体版

    "bag解压工具中文简体版"是一个专为处理特定类型——bag文件而设计的软件,尤其适用于那些喜欢或从事与《天下贰》这款游戏相关的资源管理的用户。 首先,我们要理解什么是bag文件。Bag(Binary Archive Game)是一...

    打开 bag 文件

    理解bag文件格式的关键在于掌握其内部的组织方式和数据结构,这通常需要借助专门的工具或者编程语言来实现。 **压缩包子文件的文件名称列表:ExtractorExt.dll、Extractor.exe、Scanning Results、Languages、...

    Bag的实现

    "Bag的实现"这个主题主要涉及的是数据结构中的一个特殊类型——“ Bag”或“Multiset”,它在计算机科学中是一种允许元素重复的集合。在Java编程中,我们可以通过自定义类或者使用已有的库来实现Bag。这篇博客的文章...

    hibernate bag 集合映射

    关于标签:“源码”和“工具”,这暗示了这篇博文可能深入解析了Hibernate框架内部关于bag集合映射的源代码实现,并提供了实用的工具或技巧来帮助开发者理解和使用这一特性。源码分析有助于理解Hibernate的工作原理...

    RatSLAM的bag文件提取资源

    在处理这些.bag文件时,首先你需要了解ROS的bag命令行工具,例如`rosbag info`用于查看文件内容,`rosbag play`用于回放数据,以及`rosbag record`用于创建新的bag文件。提取数据可能涉及使用`rosbag extract`命令...

    lego-loam bag文件

    lego-loam bag文件

    rosbag包转kitti数据集

    因此,我们直接得到的数据是以.bag文件格式保存的。但是,大多数现有感知网络框架的数据格式与 KITTI 数据集的数据格式一致。在 KITTI 数据集中,图像文件保存为 .png 格式,PointCloud 文件保存为 .bin 文件。所以...

    炭块清理rosbag包

    炭块清理rosbag包,可以通过rosbag play --wait -k bag_name 进行回放

    velodyne_points.bag

    利用vlp16录制的点云bag包----velodyne_points.bag,topic为velodyne_points,利用rviz可以实现可视化,效果好

    KITTI数据集图像序列转换成rosbag文件

    该脚本可以将KITTI数据集中的图像序列换转成ROS中的.bag文件格式。具体使用方法代码中给了示例。例如:将双目数据转换成.bag文件: python img2bag_kitti_StereoBag.py /home/Andy/my_workspace/Dataset/KITTI/01 ...

    KITTI数据集 转换为ROSBAG格式,且补充了点云格式转换部分,比原始的全面一些

    5. **ROSBag创建**:使用ROS的`rosbag`命令行工具或编程接口,将转换后的消息写入ROSBag文件。 6. **元数据保存**:除了原始数据,还需要保存相关的元数据,如传感器配置、车辆状态等,这些信息在ROSBag中通常以....

    bag of word demo

    总结来说,"bag of word demo"是一个用Matlab实现的示例,展示了如何使用BoW模型处理图像数据,特别是对于图像分类和识别的应用。用户可以通过运行提供的m文件和exe文件,了解和学习BoW的工作流程,同时借助"images...

    ROS机器人技术-rosbag详细使用教程!.pdf

    - `rosbag record -O &lt;bag_name.bag&gt; &lt;topic1_name&gt; &lt;topic2_name&gt; ...`: 录制指定话题,并将 bag 文件命名为 `&lt;bag_name.bag&gt;`。 - 如果不指定文件名,`rosbag record` 将自动根据结束时间生成文件名。 2. **...

    一个semantickitti的rosbag包

    这是一个semantickitti的 rosbag包。可以播放格式为PointXYZL的点云,以及对应的/tf消息。标签是完全准确的,可以用来测试语义建图算法。

    ET-BAG软件CAD出格系统教程.pdf

    这些功能为用户在绘图过程中提供了强大的工具支持,无论是细节处理还是整体布局,都能够得到很好的实现。 总结来说,ET-BAG软件CAD出格系统教程为设计者提供了一套系统全面的CAD设计学习指南。它不仅涵盖了智能笔、...

    bag打包程序

    通过查看和研究源代码,他们可以理解程序的工作原理,学习如何实现类似的功能,甚至对程序进行定制或优化。 总的来说,Bag打包程序是游戏开发中的一个重要工具,它简化了资源管理,提高了效率,并且由于其开源性质...

    邦臣ET bag CAD箱包制版.zip

    通过熟练运用这套系统,企业可以实现设计、生产和管理的现代化,提高市场竞争力,降低成本,推动箱包行业的持续发展。对于有志于进入或已经在该行业工作的朋友来说,掌握邦臣ET BAG系统无疑是一项必备的技能。

    k-means + Bag of features 源码

    在给定的项目中,Matlab和C++结合使用,Matlab可能用于图像处理和初步的数据预处理,如特征提取,而C++则可能用于构建高效的BoF模型和k-means聚类,以及实现搜索功能。Matlab提供了丰富的图像处理工具箱,易于实现和...

Global site tag (gtag.js) - Google Analytics