Scalaで文字セットを作成するにはどうすればよいですか?

スカラでA..Za..z0..9のような文字範囲のセットを作成したいと思います。ここに私のテイクです:

scala> ('A' to 'Z').toSet.union(('a' to 'z').toSet).union(('0' to '9').toSet)
res3: scala.collection.immutable.Set[Char] = Set(E, e, X, s, x, 8, 4, n, 9, N, j, y, T, Y, t, J, u, U, f, F, A, a, 5, m, M, I, i, v, G, 6, 1, V, q, Q, L, b, g, B, l, P, p, 0, 2, C, H, c, W, h, 7, r, K, w, R, 3, k, O, D, Z, o, z, S, d)

これは慣用的なやり方ではありません。より良い方法は何ですか?

2
パブロとポール - 私はあなたの応答に感謝します。あなたはどちらもこのディスカッションに追加されました。パブロの答えから、私は(...)への道を見つけました。しかし、ポールの答えは技術的に正しいので、私は受け入れられた答えに切り替えました。私は皆さんから学びました。ありがとうございました。
追加された 著者 Reece,

5 答え

これはどう:

scala> ('a' to 'z').toSet ++ ('A' to 'Z') ++ ('0' to '9')
res0: scala.collection.immutable.Set[Char] = Set(E, e, X, s, x, 8, 4, n, 9, N, j, y, T, Y, t, J, u, U, f, F, A, a, 5, m, M, I, i, v, G, 6, 1, V, q, Q, L, b, g, B, l, P, p, 0, 2, C, H, c, W, h, 7, r, K, w, R, 3, k, O, D, Z, o, z, S, d)

あるいは、

scala> (('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9')).toSet
res0: scala.collection.immutable.Set[Char] = Set(E, e, X, s, x, 8, 4, n, 9, N, j, y, T, Y, t, J, u, U, f, F, A, a, 5, m, M, I, i, v, G, 6, 1, V, q, Q, L, b, g, B, l, P, p, 0, 2, C, H, c, W, h, 7, r, K, w, R, 3, k, O, D, Z, o, z, S, d)
17
追加された
@パブロ:あなたは再びタイトルを読む必要があります。また、 "toSet"は実装を変更するだけではありません。
追加された 著者 Kim Stebel,
最初の toSet は必要ありません
追加された 著者 Pablo Fernandez,
彼はおそらく実装について気にしません
追加された 著者 Pablo Fernandez,
私は彼が文字通りセットで言ったときに彼を連れて行きませんでした。答えが正しいものとして選ばれてから私は正しいと思います。
追加された 著者 Pablo Fernandez,
はい、そうです。そうでなければ、SetではなくIndexedSeqを取得します。
追加された 著者 Paul Butcher,
('0' to 'z').filter(_.isLetterOrDigit).toSet
4
追加された
@ziggistar:もちろん、これは単なる最適化であり、範囲を実行することができます。 0から127までです。また、他のソリューションでは、ASCIIも知っておく必要があります。範囲a..zに文字のみが含まれているという前提は、他のエンコーディング(EBCDICなど)では真ではありません。
追加された 著者 Landei,
@レックスカー:ありがとう、修正されました。
追加された 著者 Landei,
IMHOこれは非常に読みやすいコードではありません。あなたは、セットで終わるものを推測するためにASCIIコードを知る必要があります。
追加された 著者 ziggystar,
なぜ '0'から 'z'までフィルター(_。isLetterOrDigit)toSet
追加された 著者 Rex Kerr,

コードのより機能的なバージョンは次のとおりです。

scala> Traversable(('A' to 'Z'), ('a' to 'z'), ('0' to '9')) map (_ toSet) reduce (_ ++ _)

上記のソリューションと組み合わせると、次のようになります。

scala> Seq[Seq[Char]](('A' to 'Z'), ('a' to 'z'), ('0' to '9')) reduce (_ ++ _) toSet

3つのセットしかない場合、他の解決法は簡単ですが、この構造は、より多くの範囲がある場合や、実行時に与えられた場合にもうまく機能します。

3
追加された

私はそれがこれより簡単ではないと思う:

('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9')

( 'A'から 'z')には両方が含まれていると推測されるかもしれませんが、

([, \, ], ^, _, `)

注:

これは Set ではなく IndexedSeq を返します。私は実装を気にしないと思っていましたが、そうした場合、 Set が必要な場合は、結果に toSet を呼び出してください。

1
追加された
OPがそれを受け入れたとマークしたときにあなたが "役に立たない"という質問をdownvotingしているのは面白いですか?
追加された 著者 Pablo Fernandez,
答えは間違っていない、それは不完全です。私は今メモを追加しました、downvoteを再考してください
追加された 著者 Pablo Fernandez,
それはセットではありません。これは実際には Vector IndexedSeq とタイプ)として終了します。また、 0 から 9 までの整数値も含まれています。
追加された 著者 Rex Kerr,
OPがそれを認識するかどうかにかかわらず、答えは間違っています。 StackOverflowは同じ質問を持つ他の人の参考になるように設計されているため、元の質問者が満足しているかどうかで質問に答えているかどうか
追加された 著者 Rex Kerr,
0〜9 を修正したので、実際には間違っているだけで、不完全ではありません。
追加された 著者 Rex Kerr,

可能なすべての文字を生成したい場合は、これを実行するとcharが取ることができるすべての値が生成されます。

(' ' to '~').toSet 
0
追加された