04.Ruby學習分享之哈希、集合和範圍
2017-03-25 本文已影响56人
清水川崎
我們先說下上次的作業
輸入:input 輸出output
例如input 為 [1,2,3],output為[2,4,6]
其實這道題了,核心為使用迭代器對數組中的元素進行操作,無非就是三個或者兩個步驟
我們先說下使用each迭代器
<ol>
<li>新建一個名為output的新數組</li>
<li>然後使用each迭代器對原數組input遍歷并添加給output數組</li>
<li>讓output返回</li>
</ol>
代碼如下
def self.input(input)
#新建一個名為output的數組
output = []
#利用each迭代器對原數組遍歷并添加給output
input.each {|e| output << e * 2 }
#返回output數組
output
end
但是這種方法步驟太多不夠簡潔,不夠ruby,看下map迭代器的方法
def self.input2(input)
#使用map迭代器對元素組內部操作並且改變本身,返回一個新數組
input.map {|i|i*2}
end
這樣是不是簡潔多了?
廢話不多說,接下來進入今天的內容:哈希、集合和範圍
哈希
哈希其實在Java中有存在,但是後來被Map取代,在OC中叫做NSDictory,也就是字典。所謂的hash就是擁有一對key和value組成鍵值對的數據結構。相當於你查單人旁,字典告訴你在多少頁一樣。那麼單人旁就是key,多少頁就是value。
我們先看下它的一些基本語法.
# 定義一個Hash
h = {a:3,b:4}
# 上面的a和b都是symbol即是:a,:b,而不是字符串a和b
p h
# 箭頭定義
h = {:a => 3,:b => 4}
p h
# 字符串也可以用作key但是必須寫成箭頭定義的樣式
# 本來Hash的key只能為symbol,因為寫的人太多了,於是Ruby內部幫我們實現了這個轉換
h = {'a' => 3,'b' => 4}
p h['b']
# 使用實例化方法定義
h = Hash.new
# 實例化方法定義缺省value值為4的Hash
h = Hash.new 4
p h['aaa'],h['bbb']
# 上述也和數組的定義是一樣的,每個key對應的都是同一片內存區域,一旦一個被改變就都被改變
# 要是想要生成獨立的,依然需要使用Block
# (注:h指代Hash本體,k指代key,=後面為賦值的缺省值)
h = Hash.new {|h,k|h[k] = 's'}
p h['a'].object_id,h[3].object_id
# Hash也可以使用Array當做Value
h = Hash.new {|h,k|h[k] = []}
# 任意選擇key
p h['asfdk']
# 給key為'asfdk'的,添加兩個字符串'abc'
h['asfdk'] << 'abc'
h['asfdk'] << 'abc'
p h
# 打印后結果為{"asfdk"=>["abc", "abc"]}
有了基本語法以後,我們看下它的一些常用方法
h = {a:1,b:2}
# 添加一個新的key和value,必須使用使用字符串、數字、symbol,不能使用例如h[a] = 3這樣的
h[:c] = 3
p h
# 根據key刪除制定元素
h.delete :a
p h
# 同時取出key和value
p h.assoc :b
# 判斷Hash是否為空
p h.empty?
# 判斷是否包含指定的key或者Value
p h.has_key? :b
p h.has_value? 2
# 取出所有key和value
p h.keys,h.values
# 把Hash轉變為Array(會變為二元數組)
p h.to_a
# 把Hash轉變為字符串
p h.to_s
# 合併兩個Hash
h2 = {d:4}
p h.merge h2
我們再來看下hash的迭代器有哪些?
# 同時遍歷Hash和Key
h.each {|key,value|p [key,value]}
# 只遍歷Key
h.each_key {|key|p key}
# 只遍歷value
h.each_value {|value|p value}
# 選擇滿足某些條件的
p h.select {|key|key == :b}
接下來我們來說下Set
有OC基礎或Java基礎的人,對這個並不陌生,Set主要是用來存儲一些不重複的數據,因為Set裡面不存在有重複數據,其實它內部是無序的,Ruby中的Set用作求交集補集什麼的。在使用Set前,我們需要先引入。
# 使用Set需要導入Set
require 'Set'
s = Set.new [1,2]
p s
# 添加新元素
s.add 'foo'
p s
b = Set.new [2,3,4]
p b
# Set的集合運算
# 求s和b的交集
p s & b
# 求s和b的並集
p s | b
# 判斷s是否是b的子集
p s <= b
還剩下一個內容,那就是Range
Range在Ruby裡面就是範圍,它的定義非常簡單
# Range在Ruby中表示範圍,前面的題目中談到for in的時候有提到
# ..表示雙閉區間(包含兩端),...表示前端為閉區間但不包含末端
r = 1..2
# 既然是雙閉區間,我們來判斷一下r是否包含2
p r.include?2
#當然包含了
最後我們還是談一下一個甜蜜的負擔——作業
甜蜜的負擔這個詞是我的日語老師告訴我的,學Ruby的話,最好需要日本語を勉強します(學習日語),因為找工作的時候都會要求N2以上。具體原因請看我的01.
作業
如何解決Hash中String和Symbol作為key的互換問題
如果定義hash的時候key是用symbol定義,那麼使用string作為key就是取不到的。如何使用string和symbol都能取到了?
例如
h = {a:1}
#如何使用:a和'a'都能取到?