Заменяет функцию "происходит в", чтобы найти строку в массиве {String, 1} - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь сделать

i = occursin("ENTITIES\n", lines)
i != 0 || error("ENTITIES section not found")

Информация об ошибке

ERROR: LoadError: LoadError: MethodError: no method matching occursin(::String, ::Array{String,1})
Closest candidates are:
  occursin(::Union{AbstractChar, AbstractString}, ::AbstractString) at strings/search.jl:452

Это часть кода julia v0.6. Я использую v1.1 сейчас. Я новичок в Джулии и не знаю, какая функция для этого нужна. Пожалуйста, помогите.

1 Ответ

1 голос
/ 21 апреля 2019

Вы можете транслировать orrursin следующим образом (добавьте . после имени функции):

julia> x = "abc"
"abc"

julia> y = ["abc", "xyz"]
2-element Array{String,1}:
 "abc"
 "xyz"

julia> b = occursin.(x, y)
2-element BitArray{1}:
  true
 false

julia> findall(b)
1-element Array{Int64,1}:
 1

julia> findfirst(b)
1

Обратите внимание, что, хотя String может быть повторен по нему, трансляция рассматривается как скаляр.

Также стоит помнить, что occursin возвращает значение Bool, чтобы вы могли использовать его непосредственно в логических тестах, например, i || error("ENTITIES section not found") в коде из вашего вопроса.

В порядкечтобы найти индекс в коллекции вхождений true в возвращаемом значении передаваемых occursin, используйте findall или findfirst функций (есть также findlast).Разница в том, что findall возвращает вектор записей, где в коллекции встречается true, а findfirst возвращает только первую такую ​​запись.Также обратите внимание на разницу, когда вы передаете все falses ему.findall вернет пустой вектор и findfirst вернет nothing.

Если вы не хотите сохранять вектор b в коде выше, вы можете получить индексы напрямую (это должнобыстрее) передавая предикат в качестве первого аргумента findall / findfirst:

julia> findall(t -> occursin(x, t), y)
1-element Array{Int64,1}:
 1

julia> findfirst(t -> occursin(x, t), y)
1
...