我想在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)
这不是这种惯用方法。什么是更好的方式?
答案 0 :(得分:18)
这个怎么样:
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)
答案 1 :(得分:4)
('0' to 'z').filter(_.isLetterOrDigit).toSet
答案 2 :(得分:3)
您的代码的更多功能版本是:
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 :(得分:1)
我想这不可能比这更简单:
('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9')
你可能会猜到('A' to 'z')
会包含两者,但它也会增加一些额外的不良字符,即:
([, \, ], ^, _, `)
注意:强>
这不会返回Set
而是IndexedSeq
。我假设您不介意实施,但如果您这样做,并且确实需要Set
,请致电toSet
到结果。
答案 4 :(得分:0)
如果要生成所有可能的字符,执行此操作应生成char可以采用的所有值:
(' ' to '~').toSet