`
kidneyball
  • 浏览: 328963 次
  • 性别: Icon_minigender_1
  • 来自: 南太平洋
社区版块
存档分类
最新评论

多个数组下标的笛卡尔积迭代器

 
阅读更多
package net.kidneyball;

import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 一个用于获取多个数组下标的笛卡尔积的迭代器。构造此迭代器时,指定各个数组的下标上限。
 * 此迭代器每次迭代将获取这些数组下标的笛卡尔积集合中的下一个元素
 * 
 * 使用示例:
 * 有三个数组 char[] a = {'A', 'B', 'C'}; char[] b = {'A', 'B'}; char[] c = {'C', 'D'}
 * Iterator it = new IndexCartesianProductIterator(a.length, b.length, c.length);
 * while (it.hasNext()) {
 *     int[] result = it.next();
 *     System.out.println("" + a[result[0]] + b[result[1]] + c[result[2]]);
 * }
 *
 * 将显示结果:
 * AAC
 * AAD
 * ABC
 * ABD
 * BAC
 * BAD
 * ...
 *
 * **注意** 因考虑性能未做保护性的对象复制,修改it.next()所返回的int数组将影响后续求值。
 * //TODO 使用一个不可被外部改变的ArrayList子类对象作为返回值
 * @author Daniel
 *         Date: 25/12/12
 *         Time: 9:25 PM
 */
public class IndexCartesianProductIterator implements Iterator<int[]>
{
	private final int[] elementSizes;
	private int[] next;
	private boolean calculated;
	private boolean hasNext;

	private final int length;
	private int tail;

	/**
	 * 构造一个{@link IndexCartesianProductIterator}实例
	 *
	 * @param elementSizes 待求笛卡尔积的各个数组的下标上限
	 */
	public IndexCartesianProductIterator(int... elementSizes)
	{
		this.elementSizes = elementSizes;
		length = elementSizes.length;
		next = new int[length];
		Arrays.fill(next, -1);
		calculated = false;
		tail = 0;
	}

	@Override
	public boolean hasNext()
	{
		if (calculated) return hasNext;
		calculated = true;
		hasNext = findNext();
		return hasNext;
	}

	@Override
	public int[] next()
	{
		if (calculated)
		{
			if (hasNext)
			{
				calculated = false;
				return next;
			}
		} else
		{
			hasNext = findNext();
			if (hasNext) return next;
		}
		throw new NoSuchElementException();
	}

	/**
	 * 计算下一个笛卡尔积元素,存放在next数组中。若该元素存在则返回true,否则返回false
	 *
	 * @return 若存在下一个笛卡尔积元素,则返回ture,否则返回false
	 */
	protected boolean findNext()
	{
		for(;;) {
			next[tail]++;
			if (next[tail] >= elementSizes[tail]) {
				tail--;
				if (tail < 0) return false;
			}
			else if (tail < length - 1) next[++tail] = -1;
			else return true;
		}
	}

	@Override
	public void remove()
	{
		throw new UnsupportedOperationException();
	}
}
0
7
分享到:
评论

相关推荐

    php 笛卡尔积二维数组矩阵算法

    php 笛卡尔积二维数组矩阵算法 生成多个组合 php 笛卡尔积二维数组矩阵算法 生成多个组合 php 笛卡尔积二维数组矩阵算法 生成多个组合 php 笛卡尔积二维数组矩阵算法 生成多个组合 php 笛卡尔积二维数组矩阵...

    PHP实现数组的笛卡尔积运算示例

    在编程领域,数组的笛卡尔积运算是一种将多个数组组合成所有可能的元组集合的操作。这个概念源自数学中的笛卡尔积,它是指从两个或多个集合中取元素的所有可能组合。在PHP中,实现数组的笛卡尔积可以帮助开发者处理...

    html + js +vue实现商品sku 笛卡尔积

    SKU管理涉及到多个属性,如颜色、尺寸、样式等,这些属性的组合形成了一个庞大的笛卡尔积,使得每个商品变体都有唯一的标识。在本教程中,我们将探讨如何使用HTML、JavaScript和Vue.js来实现商品SKU的笛卡尔积计算。...

    JS笛卡尔积算法与多重数组笛卡尔积实现方法示例

    JavaScript中的笛卡尔积算法是一种将多个数组的所有可能的元素组合成新的数组的计算方法。它在数据处理、组合分析和算法设计中具有广泛的应用。在本文中,我们将深入探讨两种JavaScript实现笛卡尔积的方法。 首先,...

    JavaScript笛卡尔积超简单实现算法示例

    在编程语言JavaScript中实现一个笛卡尔积的算法是一个常见的练习题,对于理解数组操作、递归和函数式编程技巧很有帮助。在本文中,我们主要关注如何用JavaScript语言来实现这个算法。 首先,需要了解数组的遍历方法...

    Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例

    本文实例讲述了Python2.7基于笛卡尔积算法实现N个数组的排列组合运算。分享给大家供大家参考,具体如下: 说明:本人前段时间遇到的求n个数组的所有排列组合的问题,发现笛卡尔积算法可以解决,但是网上搜索的只有...

    .net C# 实现任意List的笛卡尔乘积算法代码

    在.NET C#编程中,笛卡尔积是一种数学概念,它用于计算两个或多个集合的所有可能组合。在给定的代码示例中,我们看到一个名为`CartesianProduct`的方法,这个方法可以计算任意数量的`List&lt;T&gt;`类型的集合的笛卡尔积。...

    c#语言实现笛卡尔积

    请输入第1个笛卡尔积的元素,中间用;分隔开 1;2;3 请输入第2个笛卡尔积的元素,中间用;分隔开 a;b 请输入第3个笛卡尔积的元素,中间用;分隔开 A;B;C;D 请输入第4个笛卡尔积的元素,中间用;分隔开 !;@ 笛卡尔积为: 1;...

    C#笛卡尔积

    当应用于两个或多个集合时,笛卡尔积会生成一个新集合,该集合包含第一个集合的每个元素与第二个集合的每个元素的配对。在C#编程中,实现笛卡尔积可以用于各种场景,如数据处理、算法设计等。 标题"**C#笛卡尔积**...

    离散数学笛卡尔积

    这个是离散数学笛卡尔积,是数据库的笛卡尔积的原理. PPT

    Matlab环境下直线特征匹配中笛卡尔积的应用.pdf

    1. 笛卡尔积概念:笛卡尔积是集合论中的一个基本概念,指的是两个集合中所有可能元素对的集合。具体来说,如果A和B是两个集合,那么A与B的笛卡尔积就是由A中的每个元素和B中的每个元素构成的有序对集合。在文档中...

    php计算多个集合的笛卡尔积实例详解

    在PHP中实现多个集合的笛卡尔积,可以通过递归或迭代的方式来完成。在这个实例中,采用了迭代的方法。首先,我们需要定义一个函数`CartesianProduct`来计算笛卡尔积。该函数接受一个包含多个集合的数组作为参数。...

    将两个表的数据通过笛卡尔积输出到新表中

    将两个表的数据通过笛卡尔积输出到新表中,通过Kettle 转换的形式跑的

    PHP笛卡尔积实现算法示例

    函数接收两个参数:`$arr` 是待计算笛卡尔积的二维数组,`$str` 是中间结果,初始为空数组。 - 首先,`array_shift($arr)` 移除数组的第一个子数组(也就是第一个一维数组)并存储在 `$first` 变量中。 - 如果 `$...

    PHP基于自定义函数生成笛卡尔积的方法示例

    上述代码实例展示了一个自定义函数`combineDika()`,它用于生成多个数组的笛卡尔积。这个函数通过接受任意数量的参数(这些参数是待组合的数组)来工作。首先,它获取所有输入数组,并初始化结果数组为第一个数组的...

Global site tag (gtag.js) - Google Analytics