From: Stefano Crocco Date: 2008-05-26T05:29:54+09:00 Subject: Re: A simple newbie question (arrays and strings) On Sunday 25 May 2008, koichirose wrote: > Today I started programming in ruby. > Here's what I managed to do so far: > > string = Dir.entries(".") > string.delete_at(0) > string.delete_at(0) > > 1. I get a list of files > 2-3. I delete the first two elements ('.' and '..') > > Now my files are all like "something - some other thing" > I want to split them: > > string.each do |s| > puts s.split("-")[0] > end > > So it outputs the "something" part in my filenames. > Now I'd like to remove duplicate entries (.uniq method right?). > Can it be done in a single line? If not, how do i get an array > containing only the "something" part to work on with .uniq? > > I tried with some loops, to create a new array with the splitted string > in it, but my PHP approach doesn't work: > i = 0 > for i in string > splitted[i] = i.split("-")[0] > i += 1 > end > > Thank you! If I understand you correctly, this (untested) should do what you want: Dir.entries('.')[2..-1].map{|f| f.split('-')[0]}.uniq Dir.entries('.')[2..-1] returns an array containing all the contents of the current directory except the first two entries (actually, the [] method of an array, when called with a range returns all the elements of the array from the first index to the last. Since negative indexes count from right to left, with the rigthmost element having index -1, here you get all the entries from 2 to the last). This avoids the two calls to delete_at. Then map is called on the array with the names of the files. Array#map passes each element of the array to the block and returns an array containing the values returned by the block for each element. In this case, each element is a string of the form 'something-something_else'. The block splits the name of the file on the '-' character, then takes (and implicitly returns) the first half (thanks to the [0]). This means that map returns an array containing all the first parts of the file names (the ones you want). After that, we call uniq on the array, creating a new array without duplicates. I hope this helps Stefano