如何从列表创建Struct?Elixir结构体创建技术问询
如何基于teams列表创建Match结构体?
嘿,我来帮你搞定这个问题!先理清楚咱们手里的代码结构,再一步步生成Match结构体~
现有代码结构
首先先把你提供的代码整理好,我还帮你补全了Match结构体的常见形式(毕竟比赛一般是两队对阵嘛):
# 定义Team结构体 defmodule Team do defstruct name: nil, points: nil end # 创建球队实例并组成列表 team1 = %Team{name: "Team 1", points: "00"} team2 = %Team{name: "Team 2", points: "50"} team3 = %Team{name: "Team 3", points: "25"} team4 = %Team{name: "Team 4", points: "12"} team5 = %Team{name: "Team 5", points: "04"} team6 = %Team{name: "Team 6", points: "32"} teams = [team1, team2, team3, team4, team5, team6] # 补全Match结构体定义(假设一场比赛有两支球队) defmodule Match do defstruct team1: nil, team2: nil end
不同场景的实现方式
接下来根据你想要的配对规则,咱们有几种不同的实现方式:
1. 按列表顺序两两配对
如果想直接按照现有列表的顺序,把相邻的两个球队组成一场比赛,用Enum.chunk_every/2就能轻松搞定:
# 按每2个球队一组,生成Match列表 matches = teams |> Enum.chunk_every(2) |> Enum.map(fn [t1, t2] -> %Match{team1: t1, team2: t2} end) # 查看结果 IO.inspect(matches)
这样会生成3场固定的比赛:Team 1 vs Team 2、Team 3 vs Team 4、Team 5 vs Team 6。
2. 随机配对球队
如果想要更随机的对阵组合,先打乱球队列表再配对就行:
# 先随机打乱球队顺序,再两两分组生成Match matches = teams |> Enum.shuffle() |> Enum.chunk_every(2) |> Enum.map(fn [t1, t2] -> %Match{team1: t1, team2: t2} end) IO.inspect(matches)
每次运行这段代码,都会得到不同的配对结果,适合需要随机对阵的场景。
3. 按分数排序后配对
如果想根据球队的分数来安排对阵(比如高分碰高分,或者高分碰低分),首先得把字符串类型的points转成整数,再进行排序:
高分对高分
# 按分数从高到低排序后,两两配对 matches = teams |> Enum.sort_by(fn team -> String.to_integer(team.points) end, :desc) |> Enum.chunk_every(2) |> Enum.map(fn [t1, t2] -> %Match{team1: t1, team2: t2} end) IO.inspect(matches)
这样最高分的Team 2会和次高分的Team 6配对,Team 3和Team 1配对,以此类推。
高分对低分
如果想要让高分球队对阵低分球队,可以这么做:
# 先按分数从高到低排序 sorted_teams = Enum.sort_by(teams, fn t -> String.to_integer(t.points) end, :desc) # 分成上下半区 top_half = Enum.take(sorted_teams, 3) bottom_half = Enum.reverse(Enum.drop(sorted_teams, 3)) # 交叉配对 matches = Enum.zip(top_half, bottom_half) |> Enum.map(fn {t1, t2} -> %Match{team1: t1, team2: t2} end) IO.inspect(matches)
这样就会出现Team 2(最高分)vs Team 5(最低分)、Team 6 vs Team 4、Team 3 vs Team 1的对阵组合。
内容的提问来源于stack exchange,提问作者Rafael Augusto
相关产品推荐
相关产品推荐

