in reply to Re: Iterator for multidimensional arrays
in thread Iterator for multidimensional arrays

Almost. A call ->next would return an array of the current 'state' of the system:
(1,a,A)
(1,a,B)
(1,b,A)
(1,b,B)
(2,a,A)
(2,a,B)
(2,b,A)
(2,b,B)
  • Comment on Re: Re: Iterator for multidimensional arrays

Replies are listed 'Best First'.
Re(3): Iterator for multidimensional arrays
by shotgunefx (Parson) on Mar 24, 2002 at 20:43 UTC
    If you want the list generated at once, you could use the following snippet by merlyn. If you want an iterative solution, you could use the following. A benefit being that it should work in relatively constant time no matter how big the arrays are.
    my @aoa = ( [1,2], ['a','b','c','d'], ['A','B','C'], ); my $iter = make_aoa_iterative(@aoa); while (my @els = $iter->() ){ print @els,"\n"; } sub make_aoa_iterative { my @arefs = @_; my @arrayindexes = (); foreach (@arefs){ push @arrayindexes,[$_,0,$#{$_}]; } return sub { return if $arrayindexes[0]->[1] > $arrayindexes[0]->[2]; my @els = map { $_->[0]->[ $_->[1]] } @arrayindexes; # Check for out of bounds.... $arrayindexes[$#arrayindexes]->[1]++; for (my $i = $#arrayindexes; $i > 0; $i--){ if ($arrayindexes[$i]->[1] > $arrayindexes[$i]->[2 +]){ $arrayindexes[$i]->[1] = 0; $arrayindexes[$i-1]->[1]++; }else{ last; } } return @els; }; }

    Update
    I'm formal-math challenged. Is this formally a permutation? If someone could clarify, I'd appreciate it.

    -Lee

    "To be civilized is to deny one's nature."
      Yeah... that's does the trick. I had been working on a version that didn't calc all possible indexes beforehand (but now I'll stop). I'll try calling it "a function that returns all possible vectors in a discrete n-dimensional space." It that trekkie enough?
        My little test is currently on the 103,000,000th permutation. It would probably be really tough if not impossible to do large sets recursively.

        -Lee

        "To be civilized is to deny one's nature."