Robert Klemme
11/20/2003 10:34:00 AM
"Dan Doel" <djd15@po.cwru.edu> schrieb im Newsbeitrag
news:3FBC87DA.1090803@po.cwru.edu...
> I'm sure there are many ways of doing this, but here's one:
>
> lst = ['alfred', 'boris', 'bruce', 'claire', 'dean', 'donald']
>
> frob = lst.map do |val|
> ["-#{val[0..0]}-", val]
> end.flatten.uniq
>
> p frob
>
> I'm not sure if #uniq is defined to leave the first occurrence and
> delete all the rest or not,
> but that's what it currently does, so it works.
There must be an inject way of doing this...
lst = ['alfred', 'boris', 'bruce', 'claire', 'dean', 'donald']
frob = lst.inject( [[], nil] ) do |(res, key), word|
k = "-#{word[0].chr}-"
res << k unless k == key
res << word
[res, k]
end[0]
But this really cries for a Hash, because we have a typical key value
relationship here:
lst = ['alfred', 'boris', 'bruce', 'claire', 'dean', 'donald']
lst.inject( Hash.new {|h,k| h[k]=[]} ) {|res,w| res["-#{w[0].chr}-"] << w;
res}.sort.flatten
In fact, I'd just return the Hash. Then you have the appropriate data
structur. Simply omit ".sort.flatten" from the line above.
Regards
robert