in reply to Iterator for multidimensional arrays

A little clarification on "every possible combination" would help (me anyway).
Do you mean... my @aoa = (
[ 1,2],
[ a,b],
[ A,B],
);

1
1a
1aA
1aB
1b
1bA
1bB


-Lee

"To be civilized is to deny one's nature."
  • Comment on Re: Iterator for multidimensional arrays

Replies are listed 'Best First'.
Re: Re: Iterator for multidimensional arrays
by jcupp (Acolyte) on Mar 24, 2002 at 10:14 UTC
    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)
      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?