Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
29
Task/Stream-merge/Elixir/stream-merge.elixir
Normal file
29
Task/Stream-merge/Elixir/stream-merge.elixir
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
defmodule StreamMerge do
|
||||
def merge2(file1, file2), do: mergeN([file1, file2])
|
||||
|
||||
def mergeN(files) do
|
||||
Enum.map(files, fn fname -> File.open!(fname) end)
|
||||
|> Enum.map(fn fd -> {fd, IO.read(fd, :line)} end)
|
||||
|> merge_loop
|
||||
end
|
||||
|
||||
defp merge_loop([]), do: :ok
|
||||
defp merge_loop(fdata) do
|
||||
{fd, min} = Enum.min_by(fdata, fn {_,head} -> head end)
|
||||
IO.write min
|
||||
case IO.read(fd, :line) do
|
||||
:eof -> File.close(fd)
|
||||
List.delete(fdata, {fd, min}) |> merge_loop
|
||||
head -> List.keyreplace(fdata, fd, 0, {fd, head}) |> merge_loop
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
filenames = ~w[temp1.dat temp2.dat temp3.dat]
|
||||
Enum.each(filenames, fn fname ->
|
||||
IO.puts "#{fname}: " <> File.read!(fname) |> String.replace("\n", " ")
|
||||
end)
|
||||
IO.puts "\n2-stream merge:"
|
||||
StreamMerge.merge2("temp1.dat", "temp2.dat")
|
||||
IO.puts "\nN-stream merge:"
|
||||
StreamMerge.mergeN(filenames)
|
||||
Loading…
Add table
Add a link
Reference in a new issue