Ruby基础语法三 :array 和 hash

Array

1. 数组定义:有序列,可容纳任意元素, 下标由0开始

1 array = [1, ‘Bob‘, 4.33, ‘another string‘]
2 puts array.first #=>1
3 p array.last #=>another string
4 p array[2] #=>4.33

2. 修改数组

 1 pop, push, <<, unshift
 2 array = [1, ‘Bob‘, 4.33, ‘another string‘]
 3 p array.pop #=>"another string"
 4 p array #=>[1, "Bob", 4.33]
 5 p array.push("another string") #=>[1, "Bob", 4.33, "another string"]
 6 p array << "another string" #=>[1, "Bob", 4.33, "another string", "another string"]
 7
 8 b = [‘a‘, ‘b‘] ; b.unshift(‘c‘) # b = ["c", "a", "b"]
 9
10 map,collect,delete,delete_at,uniq,uniq!
11 array = [1, 2, 3, 4]
12 #map对每个元素进行代码块内的操作,返回一个新的数组
13 p array.map{|num| num **2} #=>[1, 4, 9, 16]
14 p array #=>[1, 2, 3, 4]
15 #collect是map的别名
16 p array.collect{|num| num **2} #=>[1, 4, 9, 16]
17 #delete_at 删除index位置的元素
18 p array.delete_at(2),array #=>3, [1, 2, 4]
19 #delete 删除某个值
20 p array.delete(4), array #=>4, [1, 2]
21
22 for i in (1..5) do array.push(i); array.push(i) end
23 #now array:[1, 2, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
24 #uniq,遍历数组元素,删除重复值,并返回一个新的数组
25 p array.uniq, array.length #=>[1, 2, 3, 4, 5] , array不变,长度仍为12
26 #uniq!永久删除原数组中的重复元素
27 p array.uniq!, array #=>[1, 2, 3, 4, 5]   [1, 2, 3, 4, 5]

3. 遍历数组

 1 arr = []
 2 #给数组赋值
 3 (1..6).each do |i|
 4     arr << i
 5 end
 6
 7 arr.each do |e|
 8     p e
 9 end
10
11 p arr.select {|num| num > 4} #[5, 6]
12 p arr #[1, 2, 3, 4, 5, 6]

4.Copy

 1 Hash copy: (数组同)
 2 b = a  #a,b指向同一个hash
 3 b = a.clone # a,b是两个不同的hash
 4 b = a.dup # 与clone效果相同
 5
 6 但当a中元素的值也为引用时,要注意clone,copy仍然是引用。有坑,调了俩小时才弄明白,要注意:
 7 a = [{"name" => "jk", "age"=>28, "gender"=>"male"}]
 8
 9 param = ["age", "gender"]
10 param.each do |pa|
11     #b = a.clone #wrong output
12     b = [a[0].clone] #success
13     b[0].delete(pa)
14     p a, b
15 end

wrong output:

success:

5. nested arrays(平时用二维数组比较少)

1 nested_arrarys = [[1,2,3],["time","2016-12-6"],[1..20]]
2 p nested_arrarys[2]

6. 数组比较: ==

7. to_s 把数组转换成字符串,ruby在需要的情况下会自动转换。比较的时候可能会用到,如a.to_s.include?("abc")这种

8. 常用方法:

运行[].methods 查看一下,挺多,p [].methods.size 目前是176个。用的ruby是2.3.1p112

 1 ##include?
 2 a = [1,2]
 3 p a.include?(1) #true
 4 p a.include?(0) #false
 5 ##flatten : 多维数组变一维(二向箔…)
 6 nested_arrarys = [[1,2,3],["time","2016-12-6"],[1..20]]
 7 p nested_arrarys.flatten #output:[1, 2, 3, "time", "2016-12-6", 1..20]
 8 ##each_index:按数组index遍历
 9 a = [2,3, 4,5]
10 a.each_index{|i| puts "This is index #{i}"}
11 ##output:
12 ##each_with_index:遍历index和对应value
13 a = [2,3, 4,5]
14 a.each_with_index{|va, i| puts "index:#{i} value:#{va}"}
15 ##sort: 排序
16 a = [3,1,3,7,5,9,0,8]
17 p a.sort #=>[0, 1, 3, 3, 5, 7, 8, 9]
18 p a    #=>[3, 1, 3, 7, 5, 9, 0, 8]
19 ##product: combine two arrays in an interesting way
20 p [1, 2, 3].product([4, 5]) #=>[[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]

Hashes  key-value

key和value都可以是多种数据类型

1. 写法:

1 p old_syntax_hash = {:name => ‘bob‘} #=>{:name=>"bob"}
2 p new_hash = {name: ‘bob‘} #=>{:name=>"bob"}

2. 访问&赋值&删除

1 p new_hash[:name] #=>"bob"
2 new_hash[:age] = 17
3 p new_hash #{:name=>"bob", :age=>17}
4 new_hash.delete(:name)
5 p new_hash #{:age=>17}
6 3. merge两个hash
7 old_syntax_hash.merge!(new_hash)
8 p old_syntax_hash #=>{:name=>"bob", :age=>17}
9 p new_hash #=>{:age=>17}

3. 遍历:

 1 who = {:name => "who", :age => 6, :hobby => "sing"}
 2 who.each do |key, value|
 3     p "who‘s #{key} is #{value}"
 4 end
 5 #"who‘s name is who"
 6 #"who‘s age is 6"
 7 #"who‘s hobby is sing"
 8
 9 who = {:name => "who", :age => 6 }
10 who.each_key {|k| p k} #=>:name :age
11 who.each_value {|v| p v} #=> "who" 6

4. 常用方法:

 1 ##has_key?
 2 fruits = {:apple => "green", :strawberry => "red", :orange => "orange"}
 3 p fruits.has_key?(:apple) #=>true
 4 p fruits.has_key?("apple") #=>false
 5 p fruits.has_key?(:pear) #=>false
 6
 7 ##select
 8 p fruits.select {|k,v| k == :orange} #=>{:orange=>"orange"}
 9 p fruits.select {|k,v| v == "orange" || k == :strawberry}
10 #=> {:strawberry=>"red", :orange=>"orange"}
11
12 ##fetch
13 #1.key存在,返回value; 2 key 不存在:打印指定信息;不指定信息,报错
14 p fruits.fetch(:apple) #=>"green"
15 p fruits.fetch(:banana , "banana is gone") #=>"banana is gone"
16
17 ##to_a: 转成array,不改变原值
18 p fruits.to_a #=>[[:apple, "green"], [:strawberry, "red"], [:orange, "orange"]]
19 p fruits #=>{:apple=>"green", :strawberry=>"red", :orange=>"orange"}
20
21 ##keys and values
22 p fruits.keys #=>[:apple, :strawberry, :orange]
23 p fruits.values #=>["green", "red", "orange"]

5. 小练习:

Write a program that prints out groups of words that are anagrams.  (anagrams :字母相同,顺序不同而组成的词)

 1 words = [‘demo‘, ‘none‘, ‘tied‘, ‘evil‘, ‘dome‘,
 2          ‘fowl‘, ‘veil‘, ‘wolf‘, ‘diet‘, ‘vile‘,
 3          ‘flow‘, ‘neon‘]
 4
 5 result = {}
 6
 7 words.each do |word|
 8     key = word.split(‘‘).sort.join
 9     if result.has_key?(key)
10         result[key].push(word)
11     else
12         result[key] = [word]
13     end
14 end
15
16 result.each do |k, v|
17     puts "-------"
18     p v
19 end
20 output:
21 ["demo", "dome"]
22 -------
23 ["none", "neon"]
24 ……
25 ……
时间: 2024-08-03 19:31:10

Ruby基础语法三 :array 和 hash的相关文章

Python 基础语法(三)

Python 基础语法(三) --------------------------------------------接 Python 基础语法(二)-------------------------------------------- 七.面向对象编程 python支持面向对象编程:类和对象是面向对象编程的两个主要方面,类创建一个新的类型,对象是这个类的实例. 对象可以使用普通的属于对象的变量存储数据,属于对象或类的变量被称为域:对象也可以使用属于类的函数,这样的函数称为类的方法:域和方法可

黑马程序员——Java基础语法(三)---数组

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本篇博文主要的内容是java语法的第三部分--数组,数组同一种类型数据的集合.其实,数组就是一个容器.数组可以自动给数组中的元素从0开始编号,方便操作这些元素. 一.数组的定义 数组的格式一:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];如:int[] arr=new int[5]; 数组定义的格式二:元素类型[]数组名=new元素类型[]{元素,元素,……

Python基础语法三组合数据类型

一.列表(Lists) 列表属于Python中的序列类型,它是任意对象的有序集合,通过 " 位置 "或者 " 索引 " 访问其中的元素,它具有可变对象.可变长度.异构和任意嵌套的特点. 列表里第一个元素的为值或者索引是从 " 0 " 开始,第二个元素则是 " 1 ",一次类推. 列表的元素放置在方括号 [] 中,以逗号来分隔各元素: 格式如下: listname = [元素1,元素2,元素3,...,元素n ] 1 1 lis

JavaScript 基础语法三

一.循环 循环结构:在满足特定条件的情况下反复执行的操作.循环四要素:循环变量 ,循环条件 , 循环增量 ,循环体. 第一种:while 循环. while (条件表达式) {循环体;}. //第一步:定义循环变量 var count = 1; // 第二部:判断循环条件 while (count <= 5){ //第三部:循环体 console.log("跑圈") //第四步:循环增量 count++; } // 用while打印出1~100之间不是7的倍数并且不包含7的数 v

swift基础语法三(函数与闭包)

1 // Playground - noun: a place where people can play 2 3 import Cocoa 4 //函数和闭包 5 6 //函数,使用func关键字声明函数: 7 func greet(name:String, day:String) -> String { 8 return "Hello \(name), today is \(day)." 9 } 10 greet("Bob", "Tuesday&

css基础语法三

[]伪类选择器] 1.写法: 伪类选择器,在选择器后面,用:分隔,紧接伪类状态: eg : .a:link 2. 超链接的伪类状态: :link - 未访问状态 :visited - 已访问状态 :hover - 鼠标指上状态 :active - 激活选定状态(鼠标点下未松) 注意:当超链接多种伪类状态同时存在时,必须按照link-visited-hover-active的顺序,否则会导致部分选择器不生效: 3. input的伪类状态: :hover :focus - 获得焦点状态 :activ

Java基础语法(三)---数组

一.概念         同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ]数组名 = new 元素类型 [元素个数或数组长度] ; 如: int []  arr = new int [3];  也可以写成: int arr[] = new int[3]; 格式2:元素类型 []数组名 = new 元素类型 [ ]{元素1,元素2,…}; 如: int []  arr =

Java基础语法&lt;三&gt; 输入输出

1. 读取输入 Scanner in = new Scanner(System.in); 输入一行(包含空格) String str = in.nextLine() 读取一个单词(以空白符作为分隔符) String firstName = in.next(); 读取一个整数 int age = in.nextInt(); 读取一个浮点数 in.nextDouble() 输入是可见的,Scanner类不适合从控制台读取密码,Java 6引入Console实现 Console cons = Syst

python基础语法三

集合: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型  s = {1, 2, 3 } #定义集合 s = set('hello') print(s) s.pop() #指定删除 s.remove("") s.remove("sss") #删除元素不存在会报错 s.discard('sbb') #删除元素不存在,,不会报错 print(s) 集合的运算关系: python_1 = ['lcg', "szw", "zjw&q