multi dim array?

G

Gijs Nijholt

Hi (again),

I have a multi-dimensional array.. walking through an incoming string
like this:

def translate(msg)
some_alphabet = [ ["a","A"], ["b","B"], ["c","C"], ["d","D"] ]
msg.split(//).inject("") { |result, char|
result += some_alphabet[2][1]
}
end

This replaces everything in msg with a "C", as it's the third one in the
array.
But I'm looking for a way to replace not by integer/index but by char,
like:

some_alphabet["c"][1]

I hope you know what I mean.. I looked at at() and find() and scan() but
neither seems to fit this task?

Thanks!

Gijs
 
W

Wilson Bilkovich

Hi (again),

I have a multi-dimensional array.. walking through an incoming string
like this:

def translate(msg)
some_alphabet = [ ["a","A"], ["b","B"], ["c","C"], ["d","D"] ]
msg.split(//).inject("") { |result, char|
result += some_alphabet[2][1]
}
end

This replaces everything in msg with a "C", as it's the third one in the
array.
But I'm looking for a way to replace not by integer/index but by char,
like:

some_alphabet["c"][1]

I hope you know what I mean.. I looked at at() and find() and scan() but
neither seems to fit this task?

Does:
some_alphabet.detect {|e| e == "c"}[1]
..do what you're looking for?
 
G

Gijs Nijholt

hm, tried several things with detect() and they all gave a nil error
when least expected error..
so I thought maybe I need to switch to Hash instead of Array?

excuse me for posting the entire function, but this is what I've made of
it:

def translate_to_braille(msg)
#braille_alphabet = [ ["a","â "], ["b","â ƒ"], ["c","â ‰"], ["d","â ™"],
["e","â ‘"], ["f","â ‹"], ["g","â ›"], ["h","â “"], ["i","â Š"], ["j","â š"], ["k",
"â …"], ["l","â ‡"], ["m","â "], ["n","â "], ["o","â •"], ["p","â "], ["q","â Ÿ"],
["r","â —"], ["s","â Ž"], ["t","â ž"], ["u","â ¥"], ["v","â §"], ["w","â º"],
["x","â ­"], ["y","â ½"], ["z","â µ"], [" ", " "] ]
braille_alphabet = { "a"=>"â ", "b"=>"â ƒ", "c"=>"â ‰", "d"=>"â ™",
"e"=>"â ‘", "f"=>"â ‹", "g"=>"â ›", "h"=>"â “", "i"=>"â Š", "j"=>"â š", "k"=>"â …",
"l"=>"â ‡", "m"=>"â ", "n"=>"â ", "o"=>"â •", "p"=>"â ", "q"=>"â Ÿ", "r"=>"â —",
"s"=>"â Ž", "t"=>"â ž", "u"=>"â ¥", "v"=>"â §", "w"=>"â º", "x"=>"â ­", "y"=>"â ½",
"z"=>"â µ", " "=>" " }
#msg.split(//).inject("") { |result, char| result +=
braille_alphabet.first }
msg.split(//).inject("") { |result, char|
result += char + " " + braille_alphabet["r"]
}
end

the braille_alphabet["r"] nicely gives it's value, but when I replace it
with braille_alphabet[char] Ruby says:
can't convert nil into String

why?
char is not nil, because when I print it, it contains a character..


Wilson said:
Does:
some_alphabet.detect {|e| e == "c"}[1]
..do what you're looking for?
 
R

Robert Klemme

Gijs said:
Hi (again),

I have a multi-dimensional array.. walking through an incoming string
like this:

def translate(msg)
some_alphabet = [ ["a","A"], ["b","B"], ["c","C"], ["d","D"] ]
msg.split(//).inject("") { |result, char|
result += some_alphabet[2][1]
}
end

This replaces everything in msg with a "C", as it's the third one in the
array.
But I'm looking for a way to replace not by integer/index but by char,
like:

some_alphabet["c"][1]

I hope you know what I mean.. I looked at at() and find() and scan() but
neither seems to fit this task?

Is this what you want?

irb(main):001:0> "message".tr 'abc', 'CBA'
=> "messCge"

Or are you looking for an even more general mapping mechanism? In that
case you could use a Hash

irb(main):002:0> r={"a"=>"B","e"=>"X"}
=> {"a"=>"B", "e"=>"X"}
irb(main):003:0> "message".gsub(/./) {|k| r[k]||k}
=> "mXssBgX"


Kind regards

robert
 

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. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top