Ruby & RailsRuby

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'都能取到?
上一篇下一篇

猜你喜欢

热点阅读