使用Enum.find_index/2
,我们可以找到元素的索引。
但是,如果多次出现相同的元素,我们该怎么做?
我想有这种行为:
iex> find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "a" end)
[0]
iex> find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "c" end)
[2]
iex> find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "b" end)
[1, 3, 4]
感谢任何想法。
答案 0 :(得分:2)
我在库中找不到确切的函数,所以试图实现它。希望它可以帮助一些人。
defmodule Sample1 do
# combining Enum functions
def find_indexes(collection, function) do
Enum.filter_map(Enum.with_index(collection), fn({x, _y}) -> function.(x) end, elem(&1, 1))
end
end
defmodule Sample2 do
# implementing as similar way as Enum.find_index
def find_indexes(collection, function) do
do_find_indexes(collection, function, 0, [])
end
def do_find_indexes([], _function, _counter, acc) do
Enum.reverse(acc)
end
def do_find_indexes([h|t], function, counter, acc) do
if function.(h) do
do_find_indexes(t, function, counter + 1, [counter|acc])
else
do_find_indexes(t, function, counter + 1, acc)
end
end
end
IO.puts "Sample1"
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "a" end)
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "c" end)
IO.inspect Sample1.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "b" end)
IO.puts "Sample2"
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "a" end)
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "c" end)
IO.inspect Sample2.find_indexes(["a", "b", "c", "b", "b"], fn(x) -> x == "b" end)
执行如下,
% elixir find.ex
Sample1
[0]
[2]
[1, 3, 4]
Sample2
[0]
[2]
[1, 3, 4]
答案 1 :(得分:0)
或者,您可以使用0..length(list)
范围压缩列表,并使用新项目过滤列表:
line = IO.read(:stdio, :all)
|> String.split
|> Enum.zip(0..100)
|> Enum.filter(fn({_, x}) -> rem(x, 2) != 0 end)
|> Enum.map(fn({x, _}) -> "#{x}\n" end)
从stdin中过滤给定列表中的奇数元素。
请注意,范围(0..100
)中的100必须是列表的长度。我以为我有100个项目的清单。