如何在Julia中将字符串视为数组/向量

9
在Julia语言中,我想在字符串上使用定义为Array{T,1},也就是Vector{T}的函数,从而将其视为Array{Char,1}。
我想要使用的一个函数示例:
julia> deleteat!("Hrello!",2)
ERROR: MethodError: no method matching deleteat!(::String, ::Int64)
Closest candidates are:
  deleteat!(::Array{T,1} where T, ::Integer) at array.jl:1177
  deleteat!(::Array{T,1} where T, ::Any) at array.jl:1214
  deleteat!(::BitArray{1}, ::Integer) at bitarray.jl:901
  ...
Stacktrace:
 [1] top-level scope at none:0

julia> deleteat!(['H','r','e','l','l','o','!'], 2)
6-element Array{Char,1}:
 'H'
 'e'
 'l'
 'l'
 'o'
 '!'

明确一点,我想从一个字符串开始,并最终得到一个字符串,但使用数组 {Char,1} 操作来改变字符串。


那是一个有用且图文并茂的问题。 - Julia Learner
2个回答

9

在Julia中,获取一个Vector时,应该首先尝试使用collect

julia> deleteat!(collect("Hrello!"), 2)
6-element Array{Char,1}:
 'H'
 'e'
 'l'
 'l'
 'o'
 '!'

3
你应该提到这是必要的原因是字符串是不可变的。 - carstenbauer
3
“collect”是首选的方法(通常我会使用它)。实际上,您还可以写成 Vector{Char}(str)Vector{UInt8}(str) 来将其转换为字符或代码单元的可变集合。如果您需要一个只读的代码单元集合,则可以使用“codeunits”函数。 - Bogumił Kamiński
好的答案,但是逆操作是什么?最初我不是很清楚,但是我想最终得到一个字符串。 - dukereg
2
@dukereg join 应该可以完成这个任务。 - carstenbauer

6

字符串可以使用 split 函数分割成数组,然后进行操作。

例如,对于您上面的代码,可以这样做:

julia> deleteat!(split("Hrello!", ""), 2)
6-element Array{SubString{String},1}:
 "H"
 "e"
 "l"
 "l"
 "o"
 "!"

编辑

自从使用split提供上述代码示例后,我对collectsplit进行了以下基准测试比较。

结果表明,如下所示,collectsplit快得多(> 10倍)。

julia> VERSION
v"1.0.3"

julia> using BenchmarkTools

julia> @benchmark deleteat!(split("Hrello!", ""), 2)
BenchmarkTools.Trial:
  memory estimate:  1.42 KiB
  allocs estimate:  26
  --------------
  minimum time:     748.396 ns (0.00% GC)
  median time:      804.819 ns (0.00% GC)
  mean time:        1.067 μs (20.80% GC)
  maximum time:     465.984 μs (99.71% GC)
  --------------
  samples:          10000
  evals/sample:     144

julia> @benchmark deleteat!(collect("Hrello!"), 2)
BenchmarkTools.Trial:
  memory estimate:  112 bytes
  allocs estimate:  1
  --------------
  minimum time:     60.299 ns (0.00% GC)
  median time:      65.431 ns (0.00% GC)
  mean time:        89.189 ns (20.99% GC)
  maximum time:     66.601 μs (99.83% GC)
  --------------
  samples:          10000
  evals/sample:     1000

@Gnimuc的建议是首先尝试使用collect,这个基准测试证实了这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接