`
kidneyball
  • 浏览: 326847 次
  • 性别: 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 笛卡尔积二维数组矩阵...

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

    js 笛卡尔积算法的实现代码,据对象或者数组生成笛卡尔积,并介绍了一个javascript多重数组笛卡尔积的例子,以及java实现笛卡尔积的算法与实例代码。 一、javascript笛卡尔积算法代码 例子,根据对象或者数组生成...

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

    主要介绍了PHP实现数组的笛卡尔积运算,结合实例形式分析了php数组的笛卡尔积运算相关实现与使用技巧,需要的朋友可以参考下

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

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

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

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

    基于JS实现的笛卡尔乘积之商品发布

    根据给的对象或者数组生成笛卡尔积 //笛卡儿积组合 function descartes(list) { //parent上一级索引;count指针计数 var point = {}; var result = []; var pIndex = null; var tempCount = 0; var temp = []; //...

    c#语言实现笛卡尔积

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

    离散数学笛卡尔积

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

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

    主要介绍了JavaScript笛卡尔积超简单实现算法,涉及javascript数组遍历、添加简单操作技巧,需要的朋友可以参考下

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

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

    javascript笛卡尔积算法实现方法

    这里可根据给的对象或者数组生成笛卡尔积 //笛卡儿积组合 function descartes(list) { //parent上一级索引;count指针计数 var point = {}; var result = []; var pIndex = null; var tempCount = 0; var temp...

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

    笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。 假设集合A={a,b},集合B={0,1,2},则两个集合的...

    笛卡尔积测试案例原理分析

    简单的从笛卡尔积的原理上看,直观的感觉认为一个乘法处理,不会产生多大的性能问题。 而实际情况中,一个系统中的大型表,记录数达到几百万甚至上千万的以及很常见了。即便几十万行数据量的数据量,也是非常普遍

    PHP笛卡尔积实现算法示例

    ** 实现二维数组的笛卡尔积组合 ** $arr 要进行笛卡尔积的二维数组 ** $str 最终实现的笛卡尔积组合,可不写 ** @return array **/ function cartesian($arr,$str = array()){ //去除第一个元素 $first = array_...

    笛卡尔积sql

    笛卡尔积概念 以及实现,是你在实现数据统计以分析更加全面系统

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

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

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

    可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况 代码如下:using System;using System.Collections.Generic;using ...

Global site tag (gtag.js) - Google Analytics