<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: range code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 21:27:47 GMT</pubDate>
    <description>DZone Snippets: range code</description>
    <item>
      <title>Collapse ranges in arrays</title>
      <link>http://snippets.dzone.com/posts/show/4099</link>
      <description>Takes an Array and turns consecutive integers into Range objects.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Array&lt;br /&gt;    def collapse_ranges&lt;br /&gt;        return self if self.length &lt;= 2&lt;br /&gt;        self.uniq!&lt;br /&gt;        self.sort! rescue nil&lt;br /&gt;        temp_array, return_array = [], []&lt;br /&gt;        self.each_with_index do |item, i|&lt;br /&gt;            if item.respond_to?(:next)&lt;br /&gt;                temp_array.push item&lt;br /&gt;                if item.next != self[i + 1]&lt;br /&gt;                    return_array.concat 3 &lt;= temp_array.length ?&lt;br /&gt;                        [temp_array.first..temp_array.last] :&lt;br /&gt;                         temp_array&lt;br /&gt;                    temp_array.clear&lt;br /&gt;                end&lt;br /&gt;            else&lt;br /&gt;                return_array.concat 3 &lt;= temp_array.length ?&lt;br /&gt;                    [temp_array.first..temp_array.last] :&lt;br /&gt;                     temp_array&lt;br /&gt;                temp_array.clear&lt;br /&gt;                return_array.push item&lt;br /&gt;            end&lt;br /&gt;        end&lt;br /&gt;        return return_array&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt; [1, 3, 4, 5, 7, 8].collapse_ranges.join(', ')&lt;br /&gt;=&gt; 1, 3..5, 7, 8&lt;br /&gt;&gt;&gt; %w(a c d e g i j).collapse_ranges.join(', ')&lt;br /&gt;=&gt; a, c..e, g, i, j&lt;br /&gt;&gt;&gt; [1, 2.5, 3, 4, 5].collapse_ranges.join(', ')&lt;br /&gt;=&gt; 1, 2.5, 3..5&lt;br /&gt;&gt;&gt; [1, 2, 3, 4, {:test =&gt; 'value'}, 5].collapse_ranges.join(', ')&lt;br /&gt;=&gt; 1..4, testvalue, 5&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 03 Jun 2007 17:59:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4099</guid>
      <author>sporkyy (Todd Sayre)</author>
    </item>
    <item>
      <title>Find missing array items</title>
      <link>http://snippets.dzone.com/posts/show/3322</link>
      <description>This works fine for integers and letters.  It should work for anything though, so long as Ruby can form an range from the first and last array items.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Array&lt;br /&gt;    def missing_items&lt;br /&gt;        return [] if self.length &lt;= 1&lt;br /&gt;        self.uniq!&lt;br /&gt;        self.sort! rescue nil&lt;br /&gt;        begin&lt;br /&gt;            (self.first..self.last).to_a - self&lt;br /&gt;        rescue&lt;br /&gt;            []&lt;br /&gt;        end&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt; [1, 3, 4, 10].missing_items.join(', ')&lt;br /&gt;=&gt; 2, 5, 6, 7, 8, 9&lt;br /&gt;&gt;&gt; [1, 2, 7, 7.5, 8.2].missing_items.join(', ')&lt;br /&gt;=&gt; 3, 4, 5, 6, 8&lt;br /&gt;&gt;&gt; %w(a b c f g j).missing_items.join(', ')&lt;br /&gt;=&gt; d, e, h, i&lt;br /&gt;&gt;&gt; [2.5, {:test =&gt; 'value'}].missing_items.join(', ')&lt;br /&gt;=&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 18 Jan 2007 08:15:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3322</guid>
      <author>sporkyy (Todd Sayre)</author>
    </item>
  </channel>
</rss>
