String 朱莉娅:在字符串向量中搜索一个字符并添加该字符

String 朱莉娅:在字符串向量中搜索一个字符并添加该字符,string,julia,String,Julia,我想检测字符串向量中是否存在字符,以及是否没有将其添加到末尾 mystrings = ["asfs", "asfsaf", "sfas.sdg", "dsgsd", "sdgsd."] for i=1:length(mystrings) if !contains(mystrings[i],".") mystrings[i] = mystrings[i] * "." end end 以上工作。我写这篇文章更多的是想问,我是否应该改为使用某种广播,或者这是一种理想的解决方案。我认为你发布的代

我想检测字符串向量中是否存在字符,以及是否没有将其添加到末尾

mystrings = ["asfs", "asfsaf", "sfas.sdg", "dsgsd", "sdgsd."]

for i=1:length(mystrings)
  if !contains(mystrings[i],".") mystrings[i] = mystrings[i] * "." end
end

以上工作。我写这篇文章更多的是想问,我是否应该改为使用某种广播,或者这是一种理想的解决方案。

我认为你发布的代码没有任何问题。广播解决方案可能看起来像

mystrings .= (x->contains(x, '.') ? x : x*".").(mystrings)
或者如果您喜欢地图样式

map!(x->contains(x, '.') ? x : x*".", mystrings, mystrings)

两者(以及您的解决方案)都通过修改阵列来避免分配

是的,v0.6对此更好。事实上,这个解决方案(在R中是惯用的)并没有那么好。我想您可能正在
中分配一个临时数组!contains.(mystrings,“.”
,您可以执行两次,因为使用它们进行索引的方法可能意味着自动点融合无法将它们提取出来()(不过我不确定这一点)。另外,通过使用
=
而不是
=
可以在RHS上分配一个新的临时数组,您不需要这样做。另外,
!包含。(mystrings,“.”
应为
。!(包含。(mystrings,“.”)0.6上的
。我刚刚运行了基准测试,您的原始解决方案和我的两个基准测试大约为130 ns,是等效的。您的最终解决方案的基准测试时间为6微秒,因此速度慢了40倍。可能windows版本中的警告尚未更新。最好使用字符类型作为点,即
包含(x')
x*'。
。Chars可能会产生更好的优化代码(尚未对其进行基准测试),也许不应该,但
x*'。
在0.7.0-DEV.1257版上运行良好