You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于属性组织结构体列表?以Elixir团队按积分排序为例

解决Elixir中结构体列表的组织问题

嘿,针对你提出的两个问题,我来给出具体的Elixir实现方案和代码示例:

1. 基于某个属性组织结构体列表(分组)

如果你的需求是按某个属性对结构体列表进行分组(比如把积分相同的团队归为一组),可以使用Elixir标准库中的Enum.group_by/3函数。它会根据指定的属性值将列表元素分组,返回一个键为属性值、值为对应结构体列表的映射。

2. 基于数值型参数组织团队列表(排序)

如果是要按数值型参数(比如积分)对团队列表进行排序,可以用Enum.sort_by/3函数,指定排序的字段和排序规则(升序/降序)。

完整代码示例

defmodule Team do
  # 先定义Team结构体,包含name和points字段
  defstruct [:name, :points]
end

defmodule Seeder do
  def start() do
    # 把原代码中points的字符串类型改为整数,方便数值操作
    team1 = %Team{name: "Team 1", points: 10}
    team2 = %Team{name: "Team 2", points: 5}
    team3 = %Team{name: "Team 3", points: 4}
    team4 = %Team{name: "Team 4", points: 5} # 新增同积分团队用于分组演示
    team5 = %Team{name: "Team 5", points: 1}
    team6 = %Team{name: "Team 6", points: 0}

    teams = [team1, team2, team3, team4, team5, team6]

    # 演示按积分分组
    grouped_result = group_teams_by_attribute(teams, :points)
    IO.puts("按积分分组的结果:")
    IO.inspect(grouped_result)

    # 演示按积分从高到低排序
    sorted_result = sort_teams_by_numeric_param(teams, :points, :desc)
    IO.puts("\n按积分降序排序的结果:")
    IO.inspect(sorted_result)
  end

  # 按指定属性分组的通用函数
  def group_teams_by_attribute(teams, attribute) do
    Enum.group_by(teams, &Map.get(&1, attribute))
  end

  # 按数值型参数排序的通用函数,默认升序,可指定:desc降序
  def sort_teams_by_numeric_param(teams, param, direction \\ :asc) do
    Enum.sort_by(teams, &Map.get(&1, param), direction)
  end
end

# 运行示例
Seeder.start()

代码说明

  • 首先定义Team结构体明确字段,同时修正了原代码中points的类型(从字符串改为整数),确保数值操作的正确性。
  • group_teams_by_attribute/2函数借助Enum.group_by/3,可以灵活根据任意属性对团队列表分组。
  • sort_teams_by_numeric_param/3函数通过Enum.sort_by/3实现排序,支持自定义排序字段和方向,适配不同需求。
  • 在start/0中同时演示了分组和排序效果,用IO.inspect/1输出结构化结果,方便查看。

输出结果示例

运行代码后会得到类似如下的输出:

按积分分组的结果:
%{
  0 => [%Team{name: "Team 6", points: 0}],
  1 => [%Team{name: "Team 5", points: 1}],
  4 => [%Team{name: "Team 3", points: 4}],
  5 => [%Team{name: "Team 2", points: 5}, %Team{name: "Team 4", points: 5}],
  10 => [%Team{name: "Team 1", points: 10}]
}

按积分降序排序的结果:
[
  %Team{name: "Team 1", points: 10},
  %Team{name: "Team 2", points: 5},
  %Team{name: "Team 4", points: 5},
  %Team{name: "Team 3", points: 4},
  %Team{name: "Team 5", points: 1},
  %Team{name: "Team 6", points: 0}
]

内容的提问来源于stack exchange,提问作者Rafael Augusto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:33:08