在 Julia 语言中,我想在字符串上使用为 Array{T,1} aka 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'
'!'
Run Code Online (Sandbox Code Playgroud)
明确地说,我想以字符串开头并以字符串结尾,但使用数组 {Char,1} 操作来更改字符串。
可以将字符串拆分为数组,然后使用该split
函数进行操作。
例如,可以对上面的代码执行以下操作:
\n\njulia> deleteat!(split("Hrello!", ""), 2)\n6-element Array{SubString{String},1}:\n "H"\n "e"\n "l"\n "l"\n "o"\n "!"\n
Run Code Online (Sandbox Code Playgroud)\n\n编辑
\n\n由于使用 提供了上述代码示例,因此我针对这个问题split
进行了以下基准比较。collect
split
结果是collect
比如下所示快得多 (> 10X) split
。
julia> VERSION\nv"1.0.3"\n\njulia> using BenchmarkTools\n\njulia> @benchmark deleteat!(split("Hrello!", ""), 2)\nBenchmarkTools.Trial:\n memory estimate: 1.42 KiB\n allocs estimate: 26\n --------------\n minimum time: 748.396 ns (0.00% GC)\n median time: 804.819 ns (0.00% GC)\n mean time: 1.067 \xce\xbcs (20.80% GC)\n maximum time: 465.984 \xce\xbcs (99.71% GC)\n --------------\n samples: 10000\n evals/sample: 144\n\njulia> @benchmark deleteat!(collect("Hrello!"), 2)\nBenchmarkTools.Trial:\n memory estimate: 112 bytes\n allocs estimate: 1\n --------------\n minimum time: 60.299 ns (0.00% GC)\n median time: 65.431 ns (0.00% GC)\n mean time: 89.189 ns (20.99% GC)\n maximum time: 66.601 \xce\xbcs (99.83% GC)\n --------------\n samples: 10000\n evals/sample: 1000\n
Run Code Online (Sandbox Code Playgroud)\n\n@Gnimuccollect
首先尝试的建议肯定得到了这个基准的支持。
在 Julia 中,应该总是collect
首先尝试Vector
从其他东西中获取 a 。
julia> deleteat!(collect("Hrello!"), 2)
6-element Array{Char,1}:
'H'
'e'
'l'
'l'
'o'
'!'
Run Code Online (Sandbox Code Playgroud)