如何对字符串中的字母进行排序?

问题描述 投票:0回答:5

假设我有一根绳子

s = "bcabca"

取出

"aabbcc"
的最简单方法是什么,即对
s
中的字母进行排序?

r sorting
5个回答
33
投票

也许不是最简单的答案,但这会起作用:

paste(sort(unlist(strsplit(s, ""))), collapse = "")

或者修改帮助页面中为

strReverse
定义的
?strsplit
函数来满足我们的需求。我们将其称为 strSort:

strSort <- function(x)
        sapply(lapply(strsplit(x, NULL), sort), paste, collapse="")

18
投票

这是 Chase 解决方案的一个变体,它处理字符串向量并保留原始字符串作为名称。 ...我有机会推广 vapply 而非 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" 

8
投票

最好提及解决此问题的

stringi
包。它的
stri_order
stri_sort
函数非常高效,测试时间仅为上述基本 R 方法的一半。

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

4
投票

重新审视这一点,我以前的答案不太好。这是带有

base
功能的更好版本:

vapply(strsplit(x, NULL), function(x) paste(sort(x), collapse = ''), '')

基于此测试向量:

NN = 1000000L
starts = seq(1L, NN, by = 100L)
name = 
  substring(paste(sample(letters, size = NN, replace = TRUE), collapse = ""),
            starts, starts + 99L)

0
投票
library(Tmisc)

strSort(s)
# [1] "aabbcc"
© www.soinside.com 2019 - 2024. All rights reserved.