簡體   English   中英

如何對字符串中的字母進行排序?

[英]How to sort letters in a string?

假設我有一個字符串s = "bcabca"

從中獲取"aabbcc"的最簡單方法是什么,即對s的字母進行排序?

也許不是最簡單的答案,但這可行:

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

或者修改?strsplit幫助頁面中定義的strReverse函數以滿足我們的需要。 我們稱之為strSort:

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

這是Chase解決方案的變體,它處理字符串向量並將原始字符串保留為名稱。 ...我有機會推廣使用vapply over 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" 

提出這個問題的stringi包可能會很好。 它的stri_orderstri_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

重溫這一點,我的老答案不太好。 這是一個帶有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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM