字典:散列表、散列字典、关键字列表、集合与结构体
时间:2019-09-10
本文章向大家介绍字典:散列表、散列字典、关键字列表、集合与结构体,主要包括字典:散列表、散列字典、关键字列表、集合与结构体使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
字典
散列表和散列字典都实现了Dict的行为。Keyword模块也基本实现了,不同之处在于它支持重复键。
Eunm.into可以将一种类型的收集映射转化成另一种。
defmodule Sum do def values(dict) do dict |> Dict.values |> Enum.sum end end hd = [ one: 1, two: 2, three: 3 ] |> Enum.into HashDict.new IO.puts Sum.values(hd) #=>6
Dict相关API
kw_list = [name: "Dave", likes: "Programming", where: "Dallas"] hashdict = Enum.into kw_list, HashDixt.new map = Enum.into kw_list, Map.new kw_list[:name] #=>"Dave" hashdict[:likes] #=>"Programming" map[:where] #=>"Dallas" hashdict = Dict.drop(hashdict, [:where, :likes]) #=>HashDict<[name: "Dave"]> hashdict = Dict.put(hashdict, :also_likes, "Ruby) #=>HashDict<[name: "Dave", also_likes: "Ruby"]> combo = Dict.merge(map, hashdict) #合并=>%{also_likes: "Ruby", likes: "Programming", name: "Dave", where: "Dallas"}
例子:
people = [ %{ name: "Grumpy, height: 1.24 }, %{ name: "Dave", height: 1.88 }, %{ name: "Dopey", height: 1.32 }, %{ name: "Shaquille", height: 2.16 }, %{ name: "Sneezy", height: 1.28 } ] for person = %{ height: height } <- people, #将列表中的散列表绑定到person ,并将高度值绑定到height height > 1.5, #筛选出高度高于1.5的 do: IO.inspect person
例子2:
def book(%{name: name, height: height}) when height > 1.9 do ... end def book(%{name: name, height: height}) when height < 1.3 do ... end def book(person) do ... end people |> Enum.each(&HotelRoom.book/1)
更新散列表
new_map = %{ old_map | key => value, ...},会创建一个新的散列表,它是旧散列表的拷贝,但是管道运算符右边与键所对应的值会被更新。
m = %{ a: 1, b: 2, c: 3 }
m1 = %{ m | b: "two", c: "three" } #%{ a: 1, b: "two, c: "three" }
#要增加新的键值需要使用Dict.put_new/3函数
结构体
结构体就是模块,它封装了一个有限形式的散列表。有限是因为键必须为原子,并且这些散列表不具备Dict和Access特性。使用defstruct来定义散列表的性质。
结构体的使用就相当于是散列表一样,只不过结构体有默认参数。
defmodule Subscriber do defstruct name: "", paid: false, over_18: true end s1 = %Subscriber{} #=>%Subscriber{name: "", over_18: true, paid: false } s2 = %Subscriber{name: "Mary", paid: true} #=>%Subscriber{name: "Mary", over_18: true, paid: true } 匹配 s2.name #通过点标记访问,键必须为原子,符合结构体的特性 %Subscriber{name: a_name} = s3 a_name #=>"Mary"
更新
s3 = %Subscriber{ s2 | name: "Marie" }
例子:
defmodule Attendee do defstruct name: "", paid: false, over_18: true def may_attend_after_party(attendee = %Attendee{}) do #函数参数使用 %Attendee{} 接受结构体 attendee.paid && attendee.over_18 end def print_vip_badge(%Attendee{name: name}) when name != "" do IO.puts "Very cheap badge for #{name}" end def print_vip_bage(%Attendee{}) fo raise "missing name for badge" end end
散列表实现了Access协议,所以可以使用 [] 访问。我们可以给结构体添加这个功能。
defmodule Attendee do @derive Access defstruct name: "", over_18: false end a = %Attendee{name: "Sally", over_18: true} a[:name] #=> "Sally
嵌套字典结构
字典类型可以让键和值相关联,这些值本身也可以是字典类型。
defmodule Customer do defstruct name: "", company: "" end defmodule BugReport do defstruct owner: %{}, details: "", serverity: 1 end report = %BugReport{owner: %Customer{name: "Dave", company: "Pragmatic"}, detail: "broken"} #访问 report.owner.company #更新/修改 report = %BugReport{ report | owner: %Customer{ report.owner | company: "PragProg" }} #put_in可以设置嵌套结构里面的值 put_in(report.owner.company, "PargProg") #update_in可以让我们在结构体上的某一个值上执行一个函数 update_in(report.owner.name, &("Mr. " <> &1)) #连接 "Mr. "和name
原文地址:https://www.cnblogs.com/lr1402585172/p/11498408.html
- CentOS+Nginx+Tomcat搭建高性能负载均衡集群
- Java 四种线程池的使用
- 搭建 Jenkins-2.83 服务,部署 spring boot 项目
- Spring Boot 中使用 Java API 调用 lucene
- Spring Boot 中使用 Java API 调用 Elasticsearch
- Spring Boot 中使用 公共配置
- WebView 和 JS 交互,如何将 Java 对象和 List 传值给 JS ?
- Spring Boot 中使用 LogBack 配置
- Spring Boot 中使用 RabbitMQ
- 手把手教你dubbo怎么用?
- 一步一步实现Android的MVP框架
- Base封装之我的最简MVP架构
- 请求跨域的解决方案
- 运用Kubernetes进行分布式负载测试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Windows 技术篇-windows家庭版win+R运行搜不到gpedit.msc组策略编辑器解决方法,windows安装组策略编辑器方法
- SpringBoot中Tomcat是如何启动的
- JavaScript 技术篇-chrome浏览器读取剪切板命令document.execCommand(‘paste‘)返回false原因及解决方法
- Linux 技术篇-文件大小查看方法实例演示,查看指定文件大小,查看列表下所有文件夹和文件的大小
- Python 技术篇-判断指定路径下的文件是否处于打开状态或占用状态实例演示
- Python 爬虫进阶篇-利用beautifulsoup库爬取网页文章内容实战演示
- Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
- PL/SQL 数据库连接工具的下载、安装与使用实例演示
- JavaScript 技术篇-JSON字符串在线快速格式化查看实例演示,json.cn网址格式化json字符串
- Python 技术篇-含中文编码的代码运行方法,(unicode error) ‘utf-8‘ codec can‘t decode问题原因及解决方法
- Spring Boot Actuators
- 用图机器学习探索 A 股个股相关性变化
- Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
- MySQL 技术篇-mysql数据库的安装、配置与使用实例演示
- JavaScript 技术篇-js代码获取当前操作系统信息、浏览器版本信息实例演示,windows NT版本对照表