rubyとscalaを書き始めた初心者です。
以下のような型の変換のプログラムを作成しようと考えていたのですが、
エラーが出てしまったので、ご教示頂きたいです。
■変換前
Map("age"->"3", "reason"->"sounds good", "check"->Array("1", "2"), "check_pre"->"1,2")
■変換後
Map("age"->3, "reason"->"sounds good", check"->Array(1,2), "check_pre"->Array(1,2))
■変換の条件
・Mapのvalueは変換なし。
・Mapのvalueは全てString型
・valueが数値のものはInt型に変換。
・valueが配列のものはInt型の配列に変換。
・valueがカンマ区切りの文字列は、Int型の配列に変換。
途中まで作成したのですが、エラーが出てしまいました。
================================
■プログラム
val params = Map("age"->"3", "reason"->"sounds good", "check"->Array("1", "2"), "check_pre"->"1,2")
val new_params = params.mapValues{
case str if str.isInstanceOf[Array[String]] => str.map(_.toInt)
case str if str.matches("""^\d+$""") => str.toInt
case str if str.matches("""^(\d,)+\d$""") => str.split(",").map(_.toInt)
}
new_params.foreach(print)
■エラー内容
error: value matches is not a member of java.io.Serializable
================================
また、少々余談なのですが、
rubyだと、このようなパターンマッチは扱えないという認識で宜しいでしょうか。
(その場合は、filterやmergeを繰り返せばできると考えておりますが、
あまりスマートではないですかね……。)
rubyの場合の実装の指針等もございましたら、合わせてご教示頂きたいです。
宜しくお願いします。
No.1ベストアンサー
- 回答日時:
Rubyですが、
params = {"age"=>"3", "reason"=>"sounds good","check"=>["1","2"],"check_pre"=>"1,2"}
result = params.each_with_object({}) do |(k,v),x|
v = case v
when /\A\d+\z/
v.to_i
when /\A\d+(,\d+)\z/
v.split(/,/).map(&:to_i)
when String
v
when Array
v.map{|w| /\A\d+\z/=~w ? w.to_i : w }
else
raise "ERROR value=#{v.inspect}"
end
x[k]=v
end
p result
素早い回答ありがとうございます!
rubyでもcase文で書けたのですね……。
each_with_objectも知らなかったです。
プログラム例も記載していただき、誠にありがとうございます!
とても、勉強になりました!
引き続き、scalaについても回答募集しております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- その他(プログラミング・Web制作) Pythonでエクセルファイルの列を指定してスライス 3 2022/08/28 17:35
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetDlgItemInt( ) c++
-
緯度、経度の 10進法と 60進法...
-
VBAを使って二進法計算
-
分を時間に変換するプログラム
-
isoをimgに変換したいのですが...
-
【EXCEL】カナ、ひらがなを英字...
-
C/C++→JAVAに変換するツール
-
CIDコードからUNICODEへの変換...
-
線対称の角度を求める
-
StrConvの使い方について教えて...
-
C言語からC#への変換ツール
-
なぜ通信には16進数文字列が使...
-
家電製品の電力周波数を変える機械
-
VBへの変換の仕方 RS232C送信...
-
SJIS⇔UTF-8の文字コード...
-
C++からCへのソース変換について
-
機械語からアセンブリ言語への...
-
Excel-VBAのmsgBox()の不思議
-
VB6からVB2010への変換について
-
マンセル⇔XYZ,RGB変換式或いは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
Excel-VBAのmsgBox()の不思議
-
Mac 乗数の入力方法
-
家電製品の電力周波数を変える機械
-
3のつく数字と3の倍数のみを表...
-
bmp→jpgに、jpg→bmpに
-
10進数をBCDに変換する方法
-
【EXCEL】カナ、ひらがなを英字...
-
StrConvの使い方について教えて...
-
分を時間に変換するプログラム
-
画像ファイル変換(Tiff→PDF)
-
マンセル⇔XYZ,RGB変換式或いは...
-
C/C++→JAVAに変換するツール
-
VB6からVB2010への変換について
-
c++でmatからvectorへの変換の...
-
DOSコマンドでの文字コード変換...
-
VB.NETをJavaに変換するツール...
-
SJIS⇔UTF-8の文字コード...
-
なぜ通信には16進数文字列が使...
-
C#でのpngからbmpへの変換について
おすすめ情報