[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Array#squeeze

Martin DeMello

5/6/2005 6:58:00 AM

The recent mention of String#squeeze made me wonder if it would not be a
good idea to add a #squeeze method to Array (or possibly even to
Enumerable) as well. Certainly I've needed it at least as often as I've
needed #uniq

martin
5 Answers

Logan Capaldo

5/6/2005 7:13:00 AM

0

On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:
> The recent mention of String#squeeze made me wonder if it would not be a
> good idea to add a #squeeze method to Array (or possibly even to
> Enumerable) as well. Certainly I've needed it at least as often as I've
> needed #uniq
>
> martin
>
>

Well here's a possible implementation:

module Enumerable
def squeeze(*args)
raise ArgumentError.new("Provide 0 or 1 arguments") if
args.length > 1
inject([]) do |a, b|
if args.length == 0
if b == a.last
a
else
a << b
end
else
if b == a.last && a.last == args[0]
a
else
a << b
end
end
end
end
end



dblack

5/6/2005 10:58:00 AM

0

Martin DeMello

5/6/2005 11:54:00 AM

0

David A. Black <dblack@wobblini.net> wrote:
> On Fri, 6 May 2005, Martin DeMello wrote:
>
> > The recent mention of String#squeeze made me wonder if it would not be a
> > good idea to add a #squeeze method to Array (or possibly even to
> > Enumerable) as well. Certainly I've needed it at least as often as I've
> > needed #uniq
>
> How close is this to what you might want, at least for Array?
>
> irb(main):001:0> a = [1,2,3,4,1,2]
> => [1, 2, 3, 4, 1, 2]
> irb(main):002:0> a |= [1,2]
> => [1, 2, 3, 4]

Nope, that's not what I meant - I wanted to compress a run of elements
into a single element, pretty much like unix's uniq does. (Logan posted
an implementation already).

martin

Mark Hubbart

5/6/2005 5:28:00 PM

0

On 5/6/05, Logan Capaldo <logancapaldo@gmail.com> wrote:
> On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:
> > The recent mention of String#squeeze made me wonder if it would not be a
> > good idea to add a #squeeze method to Array (or possibly even to
> > Enumerable) as well. Certainly I've needed it at least as often as I've
> > needed #uniq
> >
> > martin
> >
> >
>
> Well here's a possible implementation:
>
> module Enumerable
> def squeeze(*args)
> raise ArgumentError.new("Provide 0 or 1 arguments") if
> args.length > 1
> inject([]) do |a, b|
> if args.length == 0
> if b == a.last
> a
> else
> a << b
> end
> else
> if b == a.last && a.last == args[0]
> a
> else
> a << b
> end
> end
> end
> end
> end

String's squeeze allows arbitrary numbers of character arguments. II
would think Enumerable#squeeze should do the same:

module Enumerable
def squeeze(*args)
ary = []
check = proc{|item| args.empty?? true : args.include?(item) }
each{|elem| ary << elem unless ary.last == elem and check[elem] }
ary
end
end

cheers,
Mark



Logan Capaldo

5/6/2005 8:49:00 PM

0

On 5/6/05, Mark Hubbart <discordantus@gmail.com> wrote:
> On 5/6/05, Logan Capaldo <logancapaldo@gmail.com> wrote:
> > On 5/6/05, Martin DeMello <martindemello@yahoo.com> wrote:
> > > The recent mention of String#squeeze made me wonder if it would not be a
> > > good idea to add a #squeeze method to Array (or possibly even to
> > > Enumerable) as well. Certainly I've needed it at least as often as I've
> > > needed #uniq
> > >
> > > martin
> > >
> > >
> >
> > Well here's a possible implementation:
> >
> > module Enumerable
> > def squeeze(*args)
> > raise ArgumentError.new("Provide 0 or 1 arguments") if
> > args.length > 1
> > inject([]) do |a, b|
> > if args.length == 0
> > if b == a.last
> > a
> > else
> > a << b
> > end
> > else
> > if b == a.last && a.last == args[0]
> > a
> > else
> > a << b
> > end
> > end
> > end
> > end
> > end
>
> String's squeeze allows arbitrary numbers of character arguments. II
> would think Enumerable#squeeze should do the same:
>
> module Enumerable
> def squeeze(*args)
> ary = []
> check = proc{|item| args.empty?? true : args.include?(item) }
> each{|elem| ary << elem unless ary.last == elem and check[elem] }
> ary
> end
> end
>
> cheers,
> Mark
>
>

String's squeeze does, but their are problems with duplicating the
exact semantics of String#squeeze because according to the
documentation it uses the intersection of the strings passed as an
argument and has support for ranges of strings (ie "m-z"). Ranges
would be pretty easy just use x..y.include? but if we are following
the same semantics as String#squeeze your implementation is incorrect.
I will admit yours is more succint then my silly nested ifs. ;)