如何在Scala中创建一组字符?

时间:2011-12-19 01:25:39

标签: scala scala-collections

我想在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)

这不是这种惯用方法。什么是更好的方式?

5 个答案:

答案 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