Как мне создать набор символов в Scala? - PullRequest
3 голосов
/ 19 декабря 2011

Я бы хотел создать набор диапазонов символов в 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 ]

18 голосов
/ 19 декабря 2011

Как насчет этого:

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)
4 голосов
/ 19 декабря 2011
('0' to 'z').filter(_.isLetterOrDigit).toSet
3 голосов
/ 19 декабря 2011

Более функциональная версия вашего кода выглядит следующим образом:

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

Если у вас всего три набора, другойРешения проще, но эта структура также хорошо работает, если у вас больше диапазонов или они заданы во время выполнения.

1 голос
/ 19 декабря 2011

Я думаю, это не может быть проще, чем это:

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

Вы можете догадаться, что ('A' to 'z') будет включать в себя оба, но также добавляет некоторые дополнительные нежелательные символы, а именно:

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

Примечание:

Это не вернет Set, а IndexedSeq.Я предполагал, что вы не возражаете против реализации, но если вы хотите и хотите Set, просто вызовите toSet для результата.

0 голосов
/ 15 октября 2016

Если вы хотите сгенерировать все возможные символы, при этом должны быть сгенерированы все значения, которые может принимать символ:

(' ' to '~').toSet 
...