RUBY: Mehrdimensionale Arrays und Objekte

marekb

marekb

Doppel-As
Hallo erstmal,
Also ich hab da ein kleines anliegen was mehrdimensionale Arrays in Ruby betrifft:
Mal angenommen ich schreibe ein 2-Dimensionales Array und fülle es mit Werten wie folgt:

Code:
@ary = Array.new(2){Array.new()}
@ary = [[1,2],["a","b"]]

Wie komme ich dann an diese Werte ohne den Index des Arrays wie etwa mit
Code:
@ary[1][1]
zu benutzen?
Gibt es da so etwas wie eine bestimmte Suche?

Desweiteren möchte ich ein Objekt wie etwa einen Namen und eine Adresse
als Objekt erzeugen.
Code:
class Person
  def initialize(name, adresse)
     @name=name
     @adresse=adresse
  end
...
...
...
...Wie bekomme ich dann den Namen und die Adresse getrennt in das 2 Dimensionale Array?
Kann ich das Array wie ein Hash benutzen? Dass eine Person der Schlüssel ist und die restlichen Sachen wie etwa Adresse, Tel.Nummer etc die Values?
An dieser Stelle möchte ich darauf hinweisen dass ich KEIN Hash benutzen möchte.

Ich hoffe das ist einigermaßen verständlich xD

Wenn jemand eine Idee hat dann bitte melden.
Dankeschön.
Grüße
M.B.
 
Hallo,


ich verstehe deine Fragen nicht, weil Sie für mich zu unkonkret sind. Wo ist das exakte Problem und wieso willst du einen 2-dimensionalen Array erzwingen, wenn er für dich nicht optimal nutzbar ist, was spricht ferner gegen einen Hash?

Wieso willst du innerhalb des Objektes die Daten unbedingt in den Array zwängen. Damit lässt sich doch nur bescheiden arbeiten. So wie ich das sehe, braucht dein Objekt doch nur eine Methode, die ein 2-dimensionalen Array zurückliefert? Weshalb dafür bei einer Klasse Person Bedarf besteht, muss mir auch erst erklärt werden. Das nur mal, um dich zu reflektieren :)

Ein einfacher 2-dimensionaler und reichlich nutzloser Array sollte doch so ausschauen?

Code:
  def ugly_stuff
     return [[@name], [@address]]
  end


cu
 
Die Klasse "Person" war lediglich als Beispiel gedacht. Ein Hash möchte ich nicht verwenden da es dort keine Dubletten geben darf und man beschränkt auf jeweils ein Key und ein Value ist. Klar kann man Hashes verschachteln nur denke ich die Operationen damit wären wesentlich komplexer und aufwändiger als mit einem Array.

Ich gebe mal ein anderes, vielleicht etwas verständlicheres Beispiel:

In einem Spiel gibt es ein Inventar, da kann der Spieler Items ablegen wenn er sie gefunden hat.
Jedes Item ist ein Objekt und hat einen Namen und ein Gewicht. Namens-Dubletten sollen zusammengezählt werden. Das Gewicht der Gesamten Items soll nachher auch addiert werden um das Gesamtgewicht des Inventars zu ermitteln.
 
Habe gerade nix dabei zum testen, aber was passiert wenn man das Array mit .each ausliest ???
 
Mit each hast du für jedes Element die Anweisung die im Block steht.
Bsp:
Code:
ary=[["a","b"],[1,2]]
ary.each do |elem| puts elem end
#=>a
#=>b
#=>1
#=>2
 
Wieso benötigst du unbedingt das mehrdimensionelle Array??

Code:
class Typ
  def initialize(eigenschaft1, eigenschaft2)
     @eig1=eigenschaft1
     @eig2=eigenschaft2
end

Dann legst du deine Typen an die du brauchst und packst sie in ein Array!

Code:
meinTyp1 = Typ.new(1,a)
meinTyp2 = Typ.new(2,b)

puts meinTyp1.eig1 # => 1
puts meinTyp1.eig2 # => a

puts meinTyp2.eig1 # => 2
puts meinTyp2.eig2 # => b

myArray = Array.new(meinTyp1, meinTyp2)

myArray.each do |elem| 
puts elem.eig1
puts elem.eig2
end

#=>1
#=>a
#=>2
#=>b

Oder habe ich deine Frage komplett falsch verstanden? :think:
 
Hallo,


mein Vorschlag dazu. Notwendigkeit für einen 2-dimensionalen Array sehe ich aber weiterhin nicht. Fehler gehören dir, ist nur heruntergenudelt :p

PHP:
#!/usr/bin/env ruby

class Item
  attr_reader :kind, :name, :weight

  def initialize(name='unknown', weight=0)
    @kind = 'unknown'
    @name = name
    @weight = weight
  end

  def to_s
    return "I am an item of kind %s with name %s and weight %s." % [@kind, @name, @weight]
  end

  def to_a
    return [@kind, @name, @weight]
  end
end

class Honeypot < Item
  def initialize(*args)
    super
    @kind = 'Honeypot'
  end
end

class Chicken < Item
  def initialize(*args)
    super
    @kind = 'Chicken'
  end
end

class Items
  def initialize
    # Nothing special here
    @items = []
  end

  public

  def add(item)
    @items << item
    return true
  end

  def remove(item)
    @items.delete_at(@items.index(item)) 
  end

  def get
    return @items
  end

  def get_by_name(name=false)
    by_name = []
    @items.each do |item|
      if name == item.name
        by_name << item
      end
    end
    return by_name
  end
end

# For debugging purposes only
if __FILE__ == $0
  itemlist = Items.new
  a_honeypot = Honeypot.new('honeypot_1', 5)
  b_honeypot = Honeypot.new('honeypot_2', 7)
  a_chicken = Chicken.new('chicken_1', 1)
  itemlist.add(a_honeypot)
  itemlist.add(b_honeypot)
  itemlist.add(a_chicken)
  puts itemlist.get
  itemlist.get_by_name('honeypot_1')
  itemlist.remove(itemlist.get_by_name('chicken_1')[0])
  puts itemlist.get
end

cu
 
Zuletzt bearbeitet:
Jetzt leuchtet es mir ein. Wie würde man das Gesamtgewicht berechnen können? Wie krieg ich die einzelnen "Gewichte" aus dem Array zusammengezählt?
 
Du könntest die Items-Klasse z.B um folgende Methode erweitern.
PHP:
  def get_weight_by_name(name=false) 
    weight = 0
    @items.each do |item| 
      if name == item.name 
        weight += item.weight
      end 
    end 
    return weight
  end

Edit:

Vorrausgesetzt, du benutzt meinen Ansatz :P
 
Zuletzt bearbeitet:
Jo dankeschön ^^
Werde es demnächst mal versuchen.
Vielen Dank
 
Zurück
Oben