`
623deyingxiong
  • 浏览: 190386 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多维迭代器

    博客分类:
  • Java
阅读更多
package com.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author Hawkins
 * 
 * 
 *         多维集合迭代器
 */
public class MultiDimenIterator<T> {
	private Index[] table = new Index[255];// 数组从前到后,对应的是高位到低位。
	private int count = 0;
	private Map<Object, Collection<T>> dimens;

	public MultiDimenIterator(Map<Object, Collection<T>> dimens) {
		Set<Object> keySet = dimens.keySet();
		this.dimens = dimens;

		for (Object key : keySet) {
			this.addIndex(key, dimens.get(key).size());
		}
	}

	/**
	 * @param dimenID
	 * @param max
	 * @return
	 */
	private boolean addIndex(Object dimenID, int max) {
		if (isExist(dimenID)) {
			return false;
		}

		this.table[count] = new Index(dimenID, max);
		count++;
		return true;
	}

	/**
	 * @return
	 * 
	 *         移动游标到下一个元素,返回当前游标指向的元素的所在位置,即各维度索引的数组
	 */
	@SuppressWarnings("unchecked")
	public Map<Object, T> next() {
		Map<Object, T> result = null;

		boolean flag = move2Next();
		if (flag) {
			result = new HashMap<Object, T>();

			for (int i = 0; i < count; i++) {
				Object key = table[i].getDimenID();
				T value = (T) dimens.get(key).toArray()[table[i].getIndex()];
				result.put(key, value);
			}
		}

		return result;
	}

	/**
	 * @return
	 * 
	 *         是否还有元素没有被遍历到?
	 */
	public boolean hasNext() {
		if (table[0].getIndex() == table[0].length - 1) {// 若最高维度已经处于将要溢出的状态,则返回false
			return false;
		}
		return true;
	}

	/**
	 * @return
	 * 
	 *         游标指向下一个元素 进位加法,若最高位溢出,则返回false
	 */
	private boolean move2Next() {
		int i = count - 1;
		boolean nOverFlow = !table[i].addIndex();
		do {
			i--;

			if (nOverFlow == true && i >= 0) {
				nOverFlow = !table[i].addIndex();
			} else {
				break;
			}
		} while (i > 0);

		return nOverFlow;
	}

	private boolean isExist(Object dimenID) {
		for (int i = 0; i < count; i++) {
			if (table[i].getDimenID().equals(dimenID)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * @author Hawkins
	 * 
	 *         标识某一维度的某元素的索引
	 */
	public static class Index {
		private Object dimenID;
		private int index = 0;// IMPORTANT
		private int length;

		public Index(Object dimenID, int length) {
			this.dimenID = dimenID;
			this.length = length;
		}

		public Object getDimenID() {
			return dimenID;
		}

		public void setDimenID(Object dimenID) {
			this.dimenID = dimenID;
		}

		public int getIndex() {
			return index;
		}

		/**
		 * @return if 溢出 return false else return true
		 */
		public boolean addIndex() {
			boolean flag;
			if (index + 1 == length) {
				flag = false;
			} else {
				flag = true;
			}
			index = (index + 1) % length;

			return flag;
		}

	}
}

代码假设每一个维度的集合,都有唯一的标识。并假设可以随机存取。
分享到:
评论

相关推荐

    使用python实现多维数据降维操作

    #### 二、多维迭代器的降维 除了列表之外,我们还可以处理更复杂的迭代器类型,如元组、集合等。为了更好地支持这些类型,我们可以稍微修改上面的`flatten`函数。 ##### 代码示例: ```python from collections ...

    multiit:一次处理多个循环索引

    MultiIterator是一个简单的多维迭代器,每个迭代器都有自己的上限,例如: MultiIterator mi({ 4, 4, 4 }); LimitedMultiIterator是一个多维迭代器,只允许产生总和不超过给定限制值的索引组合,例如: ...

    C#迭代器

    在C#编程语言中,迭代器是一个...通过上述三个实例,我们可以看到迭代器在不同场景下的应用,从简单的数字序列到复杂的多维数组和自定义数据结构的遍历。掌握迭代器的使用对于提升C#编程效率和代码质量具有重要意义。

    C++OpenCV3源代码用迭代器访问像素

    在本篇内容中,我们将深入探讨如何利用C++与OpenCV3通过迭代器访问图像中的像素数据。这一方法不仅能够帮助我们更好地理解图像处理的基本原理,还能够在实际开发过程中提高程序效率。 ### OpenCV简介 OpenCV(Open...

    代码之美(中文完整版).pdf

    第19章 NumPy中的多维迭代器 19.1 N维数组操作中的关键挑战 19.2 N维数组的内存模型 19.3NumPy迭代器的起源 19.4 迭代器的设计 19.5 迭代器的接口 19.6 迭代器的使用 19.7 结束语 第20章 NASA火星漫步者任务中的高...

    PHP设计模式之迭代器模式的深入解析

    迭代器模式相较于传统通过索引访问集合元素的方式,提供了更好的封装性,可以应用于无限序列、对象链、多维数组等复杂场景。在这些场景下,迭代器模式可以隐藏底层数据结构的复杂性,使得客户端代码能够以一致的方式...

    fsdfsdfdsf

    19. **NumPy多维迭代器** (第 19 章): NumPy是一个科学计算库,本章可能深入讨论了在处理N维数组时的迭代机制和性能优化。 以上是对各章内容的简要概括,具体细节和深入知识将需要参考原文档获取。

    2用迭代器访问像素.rar_opencv vs_图形图像

    在这个"2用迭代器访问像素"的主题中,我们将深入探讨如何在Visual Studio(VS)环境下,利用OpenCV库通过迭代器来访问和操作图像中的每一个像素。 首先,我们需要了解OpenCV中的基本数据结构`cv::Mat`。`cv::Mat`是...

    ivl:一个C ++模板库,将语法扩展到数学符号-开源

    ivl具有数组,元组和自定义类函数对象,具有左右重载,函数流水线和函数向量化,自动延迟求值,子数组和一维或多维数组的其他视图,与stl兼容的迭代器,多维迭代器和多线程。 ivl包括一组丰富的功能和运算符,包括...

    使用vector申请多维数组

    3. **STL接口**:`vector` 支持STL的迭代器和算法,使得代码更简洁,可读性更强。 4. **安全性**:相比指针操作,`vector` 提供了更安全的访问方式,降低了空指针异常的风险。 四、使用示例 以下是一个使用嵌套 `...

    一组新的多维数组模板类

    另外,多维数组的空间是连续的,这跟用vector of vector实现的不一样,可以用迭代器 从头到脚挨个摸一遍. boost库也提供了多维数组类,当然还有别的几个数组类.我感觉boost多维数组类的缺点 就是只支持动态...

    用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)

    3. **使用NumPy的迭代器**:利用NumPy的多维迭代器`np.ndenumerate`遍历像素。 通过对比不同方法的执行时间可以看出,**直接遍历**方法虽然简单直观,但在处理大型图像时可能会比其他两种方法慢。 #### 四、结论 ...

    lstm多维输入.rar

    这里,X_train和y_train是训练数据,X_val和y_val是验证数据,epochs是训练轮数,batch_size是每次迭代的样本数量。 5. 评估和预测:训练完成后,你可以用`evaluate`方法评估模型在测试集上的性能,或使用`predict`...

    利用TensorFlow构建LSTM对多维数据进行拟合

    通过不断迭代和优化,我们可以找到最适合特定任务的LSTM配置。 综上所述,本教程展示了如何使用TensorFlow构建LSTM模型,处理多维数据拟合问题,并探讨了不同激活函数的影响。在实践中,根据数据特性、任务需求和...

    PHP foreach遍历多维数组实现方式

    首先,PHP语言内置了一个迭代器类RecursiveIteratorIterator,这个类可以轻松地遍历多维数组。我们只需创建一个RecursiveArrayIterator实例,并将其作为RecursiveIteratorIterator的构造参数传递。这样,通过foreach...

    CSharp-Advanced:堆栈和队列,多维数组,高级集合和词典,流,文件和目录,函数式编程,定义类,泛型,迭代器和比较器

    12. **迭代器**:使用`yield return`关键字创建可迭代的集合,如自定义枚举器,使代码更简洁高效。 ### 比较器(Comparers) 13. **比较器(Comparers)**:用于自定义对象的比较逻辑,如`IComparer&lt;T&gt;`接口,常...

    向量 stl 数据结构

    向量的迭代器类型通常定义为指向元素类型的指针,分为非常量迭代器(iterator)和常量迭代器(const_iterator)。 2.4 向量的实现方法 向量的实现通常涉及一个动态分配的内存块,用于存储元素。类`vector`包含以下...

    C#泛型与集合,数据结构的应用

    本主题将深入探讨C#中的泛型、集合、迭代器以及数据结构的应用,这些都是软件开发中的核心概念。 首先,泛型是C#中一个强大的特性,它允许我们在不指定具体类型的情况下编写代码。这样可以提高代码的重用性,减少...

Global site tag (gtag.js) - Google Analytics