如何 运行 枚举具有另一个可枚举条件的函数?

How to run enum functions with conditions of another enumerable?

发现很难用语言表达我的问题..

我有一个函数可以根据特定条件对可枚举进行排序,我还有另一个用 Enum.take(x, -1)

指定的可枚举
Enum.map(list, fn x -> Enum.take(x, 1) end)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.sort(&(byte_size(&1) > byte_size(&2)))
|> Enum.with_index

我想做的是将此函数应用于第二个可枚举但具有第一个的条件,以便项目与第一个的原始位置匹配,有点像这样:

iex(1)> x = [1,2,3,4,5]
[1, 2, 3, 4, 5]
iex(2)> y = [:a,:b,:c,:d,:e] 
[:a, :b, :c, :d, :e]

...
# arbitrary code to sort x such that x = [5,4,3,2,1]
# and y is sorted with the same conditions applied to x such that..
...

iex(4)> y = [:e,:d,:c,:b,:a]
[:e, :d, :c, :b, :a]

我怎样才能做到这一点?我可以使用哪种解决方法,或者是否有任何特定的语言功能可以满足我的需要?

我希望我的问题是有道理的,感谢您的阅读 :>

我认为您要做的是一个 属性 按另一个 属性 排序的列表。我想你可以这样做:

xs = [5, 4, 3, 2, 1]
ys = [:a, :b, :c, :d, :e]

Enum.zip(xs, ys) # Produces a list of pairs like {5, :a}, etc.
|> Enum.sort_by(fn {x, _y} -> x end)
|> Enum.map(&elem(&1, 1))
# => [:e, :d, :c, :b, :a]

所以基本上将您的数据打包成对,对这些对进行排序,然后解压第二个元素。

你实际上可以只 Enum.sort() 而不是 sort_by,因为元组的默认顺序是先比较第一个元素,如果第一个元素相等,则比较第二个,等等,但这是也许更明确。