[#385051] How to order Structs based on two fields — Iñaki Baz Castillo <ibc@...>

Hi, I've a struct like this:

20 messages 2011/07/01
[#385052] Re: How to order Structs based on two fields — Iñaki Baz Castillo <ibc@...> 2011/07/01

2011/7/1 I=C3=B1aki Baz Castillo <ibc@aliax.net>:

[#385057] Re: How to order Structs based on two fields — Robert Klemme <shortcutter@...> 2011/07/01

On Fri, Jul 1, 2011 at 12:55 PM, I=F1aki Baz Castillo <ibc@aliax.net> wrote=

[#385069] Offering Help — Joe Peric <peric.joe@...>

I'm new to Ruby and I am willing to learn. Anyone need help on a

18 messages 2011/07/01
[#385072] Re: Offering Help — Jeremy Heiler <jeremyheiler@...> 2011/07/01

On Fri, Jul 1, 2011 at 11:43 AM, Joe Peric <peric.joe@gmail.com> wrote:

[#385073] Re: Offering Help — Joe Peric <peric.joe@...> 2011/07/01

Never heard of it, but I'll get right on it. Thanks.

[#385082] Re: Offering Help — Joe Peric <peric.joe@...> 2011/07/02

Just finished this. I had to find some more info on exceptions to get

[#385083] Re: Offering Help — Jeremy Heiler <jeremyheiler@...> 2011/07/02

On Sat, Jul 2, 2011 at 1:39 PM, Joe Peric <peric.joe@gmail.com> wrote:

[#385102] symbol vs string for hash keys — Intransition <transfire@...>

What are the important factors to consider when deciding whether to

12 messages 2011/07/03

[#385160] Fatal Error with Ruby/GTK2, Homebrew, Green Shoes, and OSX Snow Leopard — Timothy Barnes <barnes7td@...>

I posted the below question to the Shoes mailing list and got back the

10 messages 2011/07/09

[#385194] RubyInstaller Extras — Jon <jon.forums@...>

Since 2009, we've been pleased to include Huw Collingbourne's The Book of Ruby with RubyInstaller. Well now, Huw has a newly updated version, and he's published it with No Starch Press.

11 messages 2011/07/12

[#385207] Creating a range of directories — Simon Harrison <simon@...>

I'm wanting to create a range of directories with a prefix, like the

13 messages 2011/07/13

[#385276] Is there a more efficient way to remove data from a string? — Eddie Catflap <catflaporama@...>

Hi

9 messages 2011/07/15

[#385297] Help needed for a new release of text-hyphen — Austin Ziegler <halostatue@...>

I've had folks asking me for a release of text-hyphen that works with

12 messages 2011/07/15

[#385326] Comparing hashes based on their keys — Stefano Mioli <stefano.mioli@...>

Hi list,

13 messages 2011/07/15

[#385342] moving a 1.8.6 install? — Roggie Boone <rogboone@...>

Is it possible to move the gems from a Ruby 1.8.6 install on an (old)

10 messages 2011/07/15

[#385410] Better name for #zip_with — Intransition <transfire@...>

Any ideas for a better name for:

13 messages 2011/07/18

[#385452] Ruby + USB + CCTV Camera Driver? — "Bob Carpenter." <rgc3679@...>

I want to write a Ruby driver that handles the feed from A CCTV camera.

23 messages 2011/07/18
[#385459] Re: Ruby + USB + CCTV Camera Driver? — William Rutiser <wruyahoo05@...> 2011/07/18

On 2011-07-18 1:00 PM, Bob Carpenter. wrote:

[#385461] Re: Ruby + USB + CCTV Camera Driver? — "Bob Carpenter." <rgc3679@...> 2011/07/18

William Rutiser wrote in post #1011466:

[#385462] Re: Ruby + USB + CCTV Camera Driver? — Hassan Schroeder <hassan.schroeder@...> 2011/07/18

On Mon, Jul 18, 2011 at 11:51 AM, Bob Carpenter. <rgc3679@yahoo.com> wrote:

[#385464] Re: Ruby + USB + CCTV Camera Driver? — "Bob Carpenter." <rgc3679@...> 2011/07/18

Hassan Schroeder wrote in post #1011472:

[#385471] Re: Ruby + USB + CCTV Camera Driver? — Hassan Schroeder <hassan.schroeder@...> 2011/07/18

On Mon, Jul 18, 2011 at 12:58 PM, Bob Carpenter. <rgc3679@yahoo.com> wrote:

[#385474] Re: Ruby + USB + CCTV Camera Driver? — Phillip Gawlowski <cmdjackryan@...> 2011/07/18

On Tue, Jul 19, 2011 at 12:18 AM, Hassan Schroeder

[#385477] Re: Ruby + USB + CCTV Camera Driver? — "Bob Carpenter." <rgc3679@...> 2011/07/19

Phillip Gawlowski wrote in post #1011503:

[#385509] A beginner question. — "Cajus A." <cajus_@...>

Hi i'm trying to write and example program where you speak to a

12 messages 2011/07/19

[#385542] Splitting strings — Ryan Mckenzie <ryan@...>

Hi all,

18 messages 2011/07/19

[#385565] error building ruby p290 — Dev Guy <devguy.ca@...>

I get the following build error on my Linux box while trying to build

12 messages 2011/07/20

[#385629] Are Job Ads OK? — Lee Hughes <lee@...>

Is it OK to post Ruby job ads on this forum?

12 messages 2011/07/21

[#385847] String manuplation example — kotin 76 <kotin76@...>

Hi,

15 messages 2011/07/27

[#385860] Counting lines of code in a ruby code file ignoring method code lines in the process — Harry Truax <htruax@...>

Hello,

8 messages 2011/07/27

[#385936] Help in Pointer — Tridib Bandopadhyay <tridib04@...>

Hello

18 messages 2011/07/29

[#386012] Ruby a "4th generation language"? Credible sources? — Albert Schlef <albertschlef@...>

I've noticed that Wikipedia says that "C#, Java" are 3'rd generation

13 messages 2011/07/31

[#386050] system stack error in ObjectSpace.each_object — luke gruber <luke.gru@...>

Hey guys, I'm just starting to mess around with metaprogramming in Ruby,

14 messages 2011/07/31
[#386052] Re: system stack error in ObjectSpace.each_object — Josh Cheek <josh.cheek@...> 2011/07/31

On Sun, Jul 31, 2011 at 4:29 PM, luke gruber <luke.gru@gmail.com> wrote:

[#386055] Re: system stack error in ObjectSpace.each_object — luke gruber <luke.gru@...> 2011/08/01

> Typically, SystemStackError is due to recursing for too long, perhaps I

[#386058] Re: system stack error in ObjectSpace.each_object — Robert Klemme <shortcutter@...> 2011/08/01

On Mon, Aug 1, 2011 at 3:56 AM, luke gruber <luke.gru@gmail.com> wrote:

Re: Building a tree from the leaves down

From: Kendall Gifford <zettabyte@...>
Date: 2011-07-21 20:30:07 UTC
List: ruby-talk #385634
On Thu, Jul 21, 2011 at 9:49 AM, Robert Klemme
<shortcutter@googlemail.com>wrote:

> Thomas Sawyer wrote in post #1012175:
> > Have a algorithmic problem, I can't quite get a clear idea of how to
> > handle it.
> >
> > I have a list of objects that respond to `#case` that will return nil
> > or a case object. Each case object also responds to `#case` and may
> > return nil or a case object, and so on. Basically I have to build a
> > tree from the bottom up (top down?) out of this list keyed on cases.
> >
> > Basic example, let's use this class:
> >
> >   class CaseObject
> >     attr :case
> >     def initialize(parent_case)
> >       @case = parent_case
> >     end
> >   end
> >
> > And this has been defined:
> >
> >   c1 = CaseObject.new(nil)
> >   c11 = CaseObject.new(c1)
> >   c12 = CaseObject.new(c1)
> >   c121 = CaseObject.new(c12)
> >   c122 = CaseObject.new(c12)
> >   d1 = CaseObject.new(nil)
> >   d11 = CaseObject.new(d1)
> >   d12 = CaseObject.new(d1)
> >
> > Then I am given all the _leaf_ nodes in a list:
> >
> >   [c11, c121, c122, d11, d12]
> >
> > I need to reconstruct the hierarchy into a tree (ie. a Hash):
>
> A single Hash can never be a tree.
>
> >   {
> >     c1 => {
> >       c11 => nil,
> >       c12 => {
> >         c121 => nil,
> >         c122 => nil
> >       }
> >     },
> >     d1 => {
> >       d11 => nil,
> >       d12 => nil
> >     }
> >   }
> >
> > There's probably some simple way to do this that I am overlooking, but
> > it's alluding me at the moment.
>
> Hmm...
>
> cache = Hash.new {|h,k| h[k] = {}}
>
> [c11, c121, c122, d11, d12].each do |x|
>  cache[x.case][x] = cache[x]
> end
>
> Now you only need to find the roots. :-)
>
> tree = Hash[*all_nodes.select {|x| x.case.nil?}.map {|root|
> cache[root]}]
>
> Roughly and untested.
>
> Kind regards
>
> robert
>
>
For fun, here's my OO-oriented approach with inspiration (though different)
from Robert's solution:

class CaseObject
  attr_reader :case
  attr_reader :name
  def initialize(parent, name)
    @case = parent
    @name = name
  end
  def inspect
    @name
  end
end

class Hash
  INDENT = " " * 2
  def inspect(indent = "")
    result    = "{\n"
    processed = 0
    total     = count()
    each do |k, v|
      total  += 1
      v       = v.is_a?(Hash) ? v.inspect(indent + INDENT) : v.inspect
      result << indent + INDENT + "#{k.inspect} => #{v}"
      result << "," if processed < total
      result << "\n"
    end
    "#{result}#{indent}}"
  end
end

class Tree
  attr_reader :registry
  def initialize(parent = :parent)
    @parent   = parent
    @registry = {}
  end
  def register(node)
    parent = node.send(@parent)
    if parent
      @registry[parent]     ||= {}
      @registry[parent][node] = @registry[node]
      register(parent)
    end
  end
  def to_hash
    @registry.select { |k, v| k.send(@parent_method).nil? }
  end
end

all_nodes = [
  c1   = CaseObject.new(nil, :c1),
  c11  = CaseObject.new(c1,  :c11),
  c12  = CaseObject.new(c1,  :c12),
  c121 = CaseObject.new(c12, :c121),
  c122 = CaseObject.new(c12, :c122),
  d1   = CaseObject.new(nil, :d1),
  d11  = CaseObject.new(d1,  :d11),
  d12  = CaseObject.new(d1,  :d12)
]
leaves = [c11, c121, c122, d11, d12]

puts "All Nodes: #{all_nodes.inspect}"
puts "Leaves:    #{leaves.inspect}"

tree = Tree.new(:case)
leaves.each { |x| tree.register(x) }
hash = tree.to_hash

puts "\nCache Hash:\n#{tree.registry.inspect}"
puts "\nTree Hash:\n#{hash.inspect}"

-- 
Kendall Gifford
zettabyte@gmail.com

In This Thread