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;
}
}
}
代码假设每一个维度的集合,都有唯一的标识。并假设可以随机存取。
分享到:
相关推荐
#### 二、多维迭代器的降维 除了列表之外,我们还可以处理更复杂的迭代器类型,如元组、集合等。为了更好地支持这些类型,我们可以稍微修改上面的`flatten`函数。 ##### 代码示例: ```python from collections ...
MultiIterator是一个简单的多维迭代器,每个迭代器都有自己的上限,例如: MultiIterator mi({ 4, 4, 4 }); LimitedMultiIterator是一个多维迭代器,只允许产生总和不超过给定限制值的索引组合,例如: ...
在C#编程语言中,迭代器是一个...通过上述三个实例,我们可以看到迭代器在不同场景下的应用,从简单的数字序列到复杂的多维数组和自定义数据结构的遍历。掌握迭代器的使用对于提升C#编程效率和代码质量具有重要意义。
在本篇内容中,我们将深入探讨如何利用C++与OpenCV3通过迭代器访问图像中的像素数据。这一方法不仅能够帮助我们更好地理解图像处理的基本原理,还能够在实际开发过程中提高程序效率。 ### OpenCV简介 OpenCV(Open...
第19章 NumPy中的多维迭代器 19.1 N维数组操作中的关键挑战 19.2 N维数组的内存模型 19.3NumPy迭代器的起源 19.4 迭代器的设计 19.5 迭代器的接口 19.6 迭代器的使用 19.7 结束语 第20章 NASA火星漫步者任务中的高...
迭代器模式相较于传统通过索引访问集合元素的方式,提供了更好的封装性,可以应用于无限序列、对象链、多维数组等复杂场景。在这些场景下,迭代器模式可以隐藏底层数据结构的复杂性,使得客户端代码能够以一致的方式...
19. **NumPy多维迭代器** (第 19 章): NumPy是一个科学计算库,本章可能深入讨论了在处理N维数组时的迭代机制和性能优化。 以上是对各章内容的简要概括,具体细节和深入知识将需要参考原文档获取。
在这个"2用迭代器访问像素"的主题中,我们将深入探讨如何在Visual Studio(VS)环境下,利用OpenCV库通过迭代器来访问和操作图像中的每一个像素。 首先,我们需要了解OpenCV中的基本数据结构`cv::Mat`。`cv::Mat`是...
ivl具有数组,元组和自定义类函数对象,具有左右重载,函数流水线和函数向量化,自动延迟求值,子数组和一维或多维数组的其他视图,与stl兼容的迭代器,多维迭代器和多线程。 ivl包括一组丰富的功能和运算符,包括...
3. **STL接口**:`vector` 支持STL的迭代器和算法,使得代码更简洁,可读性更强。 4. **安全性**:相比指针操作,`vector` 提供了更安全的访问方式,降低了空指针异常的风险。 四、使用示例 以下是一个使用嵌套 `...
另外,多维数组的空间是连续的,这跟用vector of vector实现的不一样,可以用迭代器 从头到脚挨个摸一遍. boost库也提供了多维数组类,当然还有别的几个数组类.我感觉boost多维数组类的缺点 就是只支持动态...
3. **使用NumPy的迭代器**:利用NumPy的多维迭代器`np.ndenumerate`遍历像素。 通过对比不同方法的执行时间可以看出,**直接遍历**方法虽然简单直观,但在处理大型图像时可能会比其他两种方法慢。 #### 四、结论 ...
这里,X_train和y_train是训练数据,X_val和y_val是验证数据,epochs是训练轮数,batch_size是每次迭代的样本数量。 5. 评估和预测:训练完成后,你可以用`evaluate`方法评估模型在测试集上的性能,或使用`predict`...
通过不断迭代和优化,我们可以找到最适合特定任务的LSTM配置。 综上所述,本教程展示了如何使用TensorFlow构建LSTM模型,处理多维数据拟合问题,并探讨了不同激活函数的影响。在实践中,根据数据特性、任务需求和...
首先,PHP语言内置了一个迭代器类RecursiveIteratorIterator,这个类可以轻松地遍历多维数组。我们只需创建一个RecursiveArrayIterator实例,并将其作为RecursiveIteratorIterator的构造参数传递。这样,通过foreach...
12. **迭代器**:使用`yield return`关键字创建可迭代的集合,如自定义枚举器,使代码更简洁高效。 ### 比较器(Comparers) 13. **比较器(Comparers)**:用于自定义对象的比较逻辑,如`IComparer<T>`接口,常...
向量的迭代器类型通常定义为指向元素类型的指针,分为非常量迭代器(iterator)和常量迭代器(const_iterator)。 2.4 向量的实现方法 向量的实现通常涉及一个动态分配的内存块,用于存储元素。类`vector`包含以下...
本主题将深入探讨C#中的泛型、集合、迭代器以及数据结构的应用,这些都是软件开发中的核心概念。 首先,泛型是C#中一个强大的特性,它允许我们在不指定具体类型的情况下编写代码。这样可以提高代码的重用性,减少...