/** * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.alipay.zdal.rule.ruleengine.cartesianproductcalculator; import java.util.Iterator; import java.util.Set; public class CartesianProductCalculatorElement implements Parent { Parent parent; final Set<Object> elementOfCartesianProductCalculation; Iterator<Object> iteratorOfCartesianProductCalculation; Object currentObject; public CartesianProductCalculatorElement(Parent listener, Set<Object> elementOfCartesianProductCalculation) { this.parent = listener; this.elementOfCartesianProductCalculation = elementOfCartesianProductCalculation; } public Object getCurrentObject() { return currentObject; } public void setParent(Parent parent) { this.parent = parent; } public Parent getParent() { return parent; } public Set<Object> getElementOfCartesianProductCalculation() { return elementOfCartesianProductCalculation; } public boolean hasNext() { if (elementOfCartesianProductCalculation == null) { return parent.parentHasNext(); } //�����һ�ν���element��hasNext���������ʼ��һ�� if (iteratorOfCartesianProductCalculation == null) { iteratorOfCartesianProductCalculation = elementOfCartesianProductCalculation.iterator(); } if (iteratorOfCartesianProductCalculation.hasNext()) { //��ǰ�ڵ㻹��nextֵ�Ļ���ֱ�ӻش���ֵ return true; } else { //û��nextֵ�Ļ���ѯ��parent�Ƿ���nextֵ�� return parent.parentHasNext(); } } /** * ��ʼ�����߼���next�߼�������ͬ��������Ҫ֪ͨparent��λ */ public void init() { if (elementOfCartesianProductCalculation == null) { currentObject = null; return; } //�����ǰ��list����nextֵ����ʹ�õ�ǰlist��nextֵ if (iteratorOfCartesianProductCalculation.hasNext()) { currentObject = iteratorOfCartesianProductCalculation.next(); } else { //����֪ͨparentҪ��λ�ˣ�Ȼ���Լ��������á� iteratorOfCartesianProductCalculation = elementOfCartesianProductCalculation.iterator(); if (iteratorOfCartesianProductCalculation.hasNext()) { currentObject = iteratorOfCartesianProductCalculation.next(); } else { currentObject = null; } } } public Object next() { if (iteratorOfCartesianProductCalculation == null) { parent.add(); return currentObject; } //�����ǰ��list����nextֵ����ʹ�õ�ǰlist��nextֵ if (iteratorOfCartesianProductCalculation.hasNext()) { currentObject = iteratorOfCartesianProductCalculation.next(); } else { //����֪ͨparentҪ��λ�ˣ�Ȼ���Լ��������á� iteratorOfCartesianProductCalculation = elementOfCartesianProductCalculation.iterator(); parent.add(); if (iteratorOfCartesianProductCalculation.hasNext()) { currentObject = iteratorOfCartesianProductCalculation.next(); } else { currentObject = null; } } return currentObject; } public void add() { next(); } public void remove() { throw new IllegalStateException("shold not be here"); } public boolean parentHasNext() { return hasNext(); } @Override public String toString() { return "current Obj:" + currentObject + "elementOfCartesianProductCalculation:" + elementOfCartesianProductCalculation; } }