From: Christian Date: 2007-08-17T23:25:01+09:00 Subject: Re: MultiValuedHash On 17 Aug., 11:05, "Robert Klemme" wrote: > 2007/8/17, Christian : > > > > > 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 many thanks for the trick But have anybody an advice how i get the filenames a.txt, b.txt .... as key and the parts 00_a.txt , 01_a.txt, 02_a.txt as values for every key. i identify a mistake to get the unique names i have to: Dir.entries("f:/base_data/ADS20/outputdaten/").each { |e| files.push(e[3..50])} filenames.push(files.select{|e| files.index(e) != files.rindex(e)}.uniq) many thanks & regards Christian