質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

991閲覧

Ruby ハッシュ検索

Meitoku

総合スコア44

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/10/05 08:11

編集2020/10/05 10:13

katouは1であり、aoiは2であると言う表現をした2次元配列があります
bに指定された人の数値を取り出すプログラムを組みたいです
この場合は1を数値として取り出したいです

b = "katou" [["katou","1"],["aoi","2"]]

###試したこと、やりたいこと
2次元配列をハッシュにして1つづつ検索をかけているのですが、nilが出力されてしまいます
nilは出力したくないです
putsで出力するとnilは見えなくなりますが、実際には存在する状態です
処理自体も恐らく、もっと簡単に書けるのでは?と思っています

a = [["katou","1"],["aoi","2"]] b = "katou" 2.times do |s| c = Hash[*a[s]] d = c.invert puts d.key(b) end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2020/10/05 08:58

提示されたスクリプトを実行すると1行目で、以下のエラーになりますが、 sample.rb:1:in `<main>': undefined local variable or method `katou' for main:Object (NameError) 本当にこのスクリプトは実行できるのでしょうか?
Meitoku

2020/10/05 09:44

すみません、""が抜けていたので修正しました
guest

回答3

0

2次元配列のデータをどのように型に嵌めるのかが肝要なのかなって思いました

ruby

1def restruct_to_person(people) 2 people.map do |person| 3 Person.new(person) 4 end 5end 6 7def find_id_by_name(people, name) 8 people.find { |person| person.name.eql?(name) } 9 .id # NOTE: 結果がない場合 nil に対して .id 呼び出しをする 10rescue NoMethodError 11 '' 12end 13 14class Person 15 attr_reader :name, :id 16 17 def initialize(person) 18 @name, @id = person 19 end 20end 21 22name = "katou" 23 24people = 25 restruct_to_person([["katou","1"],["aoi","2"]]) 26 27pp find_id_by_name(people, name) # => '1' 28pp find_id_by_name(people, 'foo') # => ''

「私ならこう書く」程度のものですが、なにか参考になれば幸いです

投稿2020/10/05 10:41

gouf

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こういうことですか?

Ruby

1a = [["katou",1],["aoi",2]] 2 3b = "katou" 4 5el = a.find{|x| x[0] == b} 6if el == nil 7 p "not found" 8else 9 p el 10 p el[1] 11end 12

投稿2020/10/05 10:15

tatsu99

総合スコア5462

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meitoku

2020/10/05 10:29

ありがとうございました! ifでnilをコントロールすれば良かったのですね・・
guest

0

2回目の繰り返し時には、d{"2"=>"aoi"}なので、bつまり"katou"の値は存在せず、d.key(b)nilになります。

#追記
質問文変更でようやく何をしたいのかが分かりました。単なる検索ですね。
1件ずつ処理しているので何か違うことをしたのだと思っていました。

Ruby

1 a = [["katou","1"],["aoi","2"]] 2 b = "katou" 3 4p a.assoc(b) 5#=> ["katou", "1"] 6p a.assoc(b)[1] 7#=> "1" 8 9 d = a.to_h 10p d 11#=> {"katou"=>"1", "aoi"=>"2"} 12p d[b] 13#=> "1"

投稿2020/10/05 10:05

編集2020/10/05 10:39
otn

総合スコア84713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meitoku

2020/10/05 10:13

すみません、言葉足らずでした nilは出力したくありません
otn

2020/10/05 10:21 編集

> nilは出力したくありません 何をしたいのかによります。 ifで判断して、"見つからない"などの文字列を表示すれば良いでしょう。 全く何も出力しないのなら、そうしてもいいし。 if d.key(b) puts d.key(b) end で、nilの時は出力しません。
Meitoku

2020/10/05 10:30 編集

ありがとうございました! ifを使えば良かったのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問