How to remove empty element in an array

Discussion in 'Ruby' started by Li Chen, Oct 23, 2006.

  1. Li Chen

    Li Chen Guest

    Hi all,

    I have an array of [1,2,''] I want change it to [1,2]. I check the
    document about Array but I can't find a way to remove the empty element.
    Any comments?

    Thanks,

    Li
     
    Li Chen, Oct 23, 2006
    #1
    1. Advertisements

  2. If you only want to get rid of empty strings
    array.reject{|element| element.empty?}

    If you want to get rid of nils
    array.compact

    Farrel
     
    Farrel Lifson, Oct 23, 2006
    #2
    1. Advertisements

  3. You can Array#reject! if you want to do it in-place or Array#delete_if if you
    want to capture the non-empty elements on a new Array instance.

    Cheers
    Ulisses Montenegro
     
    Ulisses Reina Montenegro de Albuquerque, Oct 23, 2006
    #3
  4. array.reject{|element| element.empty? rescue false}
     
    Joel VanderWerf, Oct 23, 2006
    #4
  5. Li Chen

    Li Chen Guest

    Hi Joel,

    I come out with my own solution by using a regxp:

    a=[1,2,'','']
    a.delete_if {|x| x=~/$/}
    p a

    ##output
    C:\Ruby\self>array3.rb
    [1, 2]
     
    Li Chen, Oct 23, 2006
    #5
  6. Li Chen

    Pete Yandell Guest

    Your solution is broken. It'll delete any string from the array:

    irb(main):001:0> a = [1, 2, 'a', 'b']
    => [1, 2, "a", "b"]
    irb(main):002:0> a.delete_if {|x| x =~ /$/}
    => [1, 2]


    Pete Yandell
    http://notahat.com/
     
    Pete Yandell, Oct 24, 2006
    #6
  7. Li Chen

    Li Chen Guest

    Hi,

    I think this time it should work: regxp for the empty sapce is ^\d*$.

    irb(main):003:0> a=[1,2,'','', 'a','b']
    => [1, 2, "", "", "a", "b"]
    irb(main):004:0> a.delete_if {|x| x=~/^\d*$/}
    => [1, 2, "a", "b"]


    Li
     
    Li Chen, Oct 24, 2006
    #7
  8. I'm sorry, isn't \d used for a digit?

    irb(main):006:0> a = [1, '', 'a', '2', '3456']
    => [1, "", "a", "2", "3456"]
    irb(main):007:0> a.delete_if{|x| x =~ /^\d*$/}
    => [1, "a"]

    This one will delete any string that is made of numbers only.

    Cheers,
    Alvim.
     
    Marcelo Alvim, Oct 24, 2006
    #8
  9. Li Chen

    Seth E. Guest

    How about this?

    irb(main):201:0> arr = [1,2,'']
    => [1, 2, ""]
    irb(main):202:0> arr -= ['']
    => [1, 2]
     
    Seth E., Oct 24, 2006
    #9
  10. Li Chen

    Pete Yandell Guest

    If you just want to delete empty strings (as opposed to strings
    containing only whitespace), this would seem the obvious way:

    irb(main):003:0> a = [1, 2, '', 3, '']
    => [1, 2, "", 3, ""]
    irb(main):004:0> a.delete ''
    => ""
    irb(main):005:0> a
    => [1, 2, 3]

    If you want to delete any whitespace-only strings as well:

    irb(main):002:0> a = [1, 2, '', 3, ' ']
    => [1, 2, "", 3, " "]
    irb(main):007:0> a.delete_if {|s| s =~ /^\s*$/ }
    => [1, 2, 3]

    Pete Yandell
    http://notahat.com/
     
    Pete Yandell, Oct 24, 2006
    #10
  11. Thanks! I was beginning to think I was the only one seeing that
    behaviour. I feel much better now.
     
    Patrick Spence, Oct 24, 2006
    #11
  12. <off-topic>
    I am new to the list, and have so far tried to keep myself as a silent lurker
    hidden on the corner, but coming from a Perl background (5+ years) and seeing
    this beautiful piece of code really makes me feel confident about leaving old
    habits and joining the Ruby club.
    </off-topic>
     
    Ulisses Reina Montenegro de Albuquerque, Oct 24, 2006
    #12
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.