Julia查找一般可迭代集合的算法

时间:2015-10-27 11:47:55

标签: algorithm julia

在我看来,没有适用于实现可迭代概念的简约子集的集合的c ++样式查找算法。我只能找到设计用于数组等的函数。这是一个疏忽(可能是我的!)还是有根本原因不将它包含在标准库中?我试了一下,想出了类似的东西:

function findfirst(iter, value)
    findnext(iter, start(iter), value)
end

function findnext(iter, s, value)
    s0 = s
    while !done(iter, s0)
        item, s1 = next(iter, s0)
        if item == value
            return s0, true
        else
            s0 = s1
        end
    end

    return s0, false
end

它似乎在Arrays,LinkedLists等上运行良好:

l = list(3,2,1,3)

s, found = findfirst(l,3)
while found
    item, s = next(l, s)
    @show item, s
    s, found = findnext(l, s, 3)
end

l = [3,2,1,3]
s, found = findfirst(l,3)
while found
    item, s = next(l, s)
    @show item, s
    s, found = findnext(l, s, 3)
end

生成以下输出:

(item,s) = (3,list(2, 1, 3))
(item,s) = (3,nil(Int64))
(item,s) = (3,2)
(item,s) = (3,5)

1 个答案:

答案 0 :(得分:2)

由于没有人回答帖子中隐藏的问题,以下是一个建议,使用标准包(良好做法)。当然,可以为filter表示法定义快捷方式宏/函数:

using DataStructures,Iterators

l = list(3,2,1,3)
s = filter(x->x==3,chain(l))
for item in s
    @show item
end

l = [3,2,1,3]
s = filter(x->x==3,chain(l))
for item in s
    @show item
end

输出:

item = 3
item = 3
item = 3
item = 3