2007/8/17, Christian <ozric / web.de>:
> I have a lot  of files in an folder and want loop over the files in a
> special way:
>
> Dir.entries("f:/test/").each { |e| filenames.push(e[3..50])}
>
> Now i have an array with the distinct names like:
> a.txt
> b.txt
> c.txt
> d.txt
> ...
> z.txt
>
> , but every file "have 20 parts" which i have to proceed:
> 00_a.txt
> 01_a.txt
> 02_a.txt
> ..
> 19_a.txt
>
>
> for i in 0..19
> filenames.map{ |t| if i < 10  then p  "0#{i}_#{t}"  else  p
> "#{i}_#{t}" end }
> end
>
>
> I find something about MultiValuedHash, but i didn't know how i get my
> structure (....the distinct names are the keys and the 20 parts for
> every key as values ) like the raw_data in an easy way.
>
> raw_data=[[1,'a'],[1,'b'],[1,'c'],[2,'a'],[2,['b','c']],
>           [3,'c']]
>
> class MultiValuedHash < Hash
>     def []=(key,value)
>         if has_key?(key)
>             super(key,[value,self[key]].flatten)
>         else
>             super
>         end
>     end
> end
>
> hash=MultiValuedHash.new
> raw_data.each{ |x,y| hash[x]=y }

This is shorter and more efficient:

hash = Hash.new {|h,k| h[k] = []}
raw_data.each{ |x,y| hash[x] << y }

And you even do not need a new class. :-)

Kind regards

robert