por - ¿Cómo ordenar las letras en una cadena?
ordenar cadenas en java (4)
Digamos que tengo una cadena s = "bcabca"
.
¿Cuál es la forma más sencilla de obtener "aabbcc"
, es decir, ordenar las letras en s
?
Aquí hay una variante de la solución de Chase que maneja un vector de cadenas y mantiene las cadenas originales como nombres. ... y tengo la oportunidad de promover el uso de vapply sobre sapply :-)
> x=c(''hello'', ''world'', NA, ''a whole sentence'')
> vapply(x, function(xi) paste(sort(strsplit(xi, NULL)[[1]]), collapse=''''), '''')
hello world <NA> a whole sentence
"ehllo" "dlorw" "" " aceeeehlnnostw"
Podría ser bueno mencionar el paquete stringi
para este problema. Las funciones stri_order
y stri_sort
son muy eficientes, probando en la mitad del tiempo del método R base mencionado anteriormente.
library(stringi)
## generate 10k random strings of 100 characters each
str <- stri_rand_strings(1e4, 100)
## helper function for vapply()
striHelper <- function(x) stri_c(x[stri_order(x)], collapse = "")
## timings
system.time({
v1 <- vapply(stri_split_boundaries(str, type = "character"), striHelper, "")
})
# user system elapsed
# 0.747 0.000 0.743
system.time({
v2 <- sapply(lapply(strsplit(str, NULL), sort), paste, collapse="")
})
# user system elapsed
# 2.077 0.000 2.068
identical(v1, v2)
# [1] TRUE
Quizás no sea la respuesta más simple, pero esto funcionará:
paste(sort(unlist(strsplit(s, ""))), collapse = "")
O modifique la función strReverse
que se define en la página de ayuda para ?strsplit
para satisfacer nuestras necesidades. Lo llamaremos strSort
strSort <- function(x)
sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")
Revisando esto, mi vieja respuesta no fue tan buena. Aquí hay una mejor versión con funciones base
:
vapply(strsplit(x, NULL), function(x) paste(sort(x), collapse = ''''), '''')
Basado en este vector de prueba:
NN = 1000000L
starts = seq(1L, NN, by = 100L)
name =
substring(paste(sample(letters, size = NN, replace = TRUE), collapse = ""),
starts, starts + 99L)