我正在Elixir中製作一個程序,用來計算我已經獲得的標記列表中的HTML標記類型。這意味着密鑰應該是標籤,值應該是計數。
例如在下面的示例文件
<html><head><body><sometag><sometag><sometag2><sometag>
我的輸出應該是這樣的:
html: 1
head: 1
body: 1
sometag: 3
sometag2: 1
這裏是我的代碼:
def tags(page) do
taglist = Regex.scan(~r/<[a-zA-Z0-9]+/, page)
dict = Map.new()
Enum.map(taglist, fn(x) ->
tag = String.to_atom(hd(x))
Map.put_new(dict, tag, 1)
end)
end
我知道我應該可能使用Enum.each
代替,但當我這樣做時,我的字典最終只是空的而不是不正確的。
隨着Enum.map
,這是我收到的輸出:
iex(15)> A3.test
[%{"<html" => 1}, %{"<body" => 1}, %{"<p" => 1}, %{"<a" => 1}, %{"<p" => 1},
%{"<a" => 1}, %{"<p" => 1}, %{"<a" => 1}, %{"<p" => 1}, %{"<a" => 1}]
正如你所看到的,有重複的條目和它變成詞典列表。現在,我甚至不試圖讓計數工作,只要字典不重複條目(這就是爲什麼值總是「1」)。
感謝您的任何幫助。
編輯:------------------
好了,所以我想通了,我需要使用Enum.reduce
下面的代碼產生輸出我在找(現在):
def tags(page) do
rawTagList = Regex.scan(~r/<[a-zA-Z0-9]+/, page)
tagList = Enum.map(rawTagList, fn(tag) -> String.to_atom(hd(tag)) end)
Enum.reduce(tagList, %{}, fn(tag, acc) ->
Map.put_new(acc, tag, 1)
end)
end
輸出:
%{"<a": 1, "<body": 1, "<html": 1, "<p": 1}
現在我已經完成交流的挑戰在我去的時候對標籤進行統計......如果任何人都能提供任何有關的信息,我將不勝感激!
請將imgur中的代碼片段粘貼到問題中。該片段很短,所以SO政策表示應在問題中包含短片段。這使得搜索更容易,即使在imgur被關閉的情況下也可以使用片段。 – tkowal
完成,對問題的任何見解? – KingDan