美文网首页Ruby & RailsRuby
04.Ruby學習分享之哈希、集合和範圍

04.Ruby學習分享之哈希、集合和範圍

作者: 清水川崎 | 来源:发表于2017-03-25 02: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'都能取到?

    相关文章

      网友评论

        本文标题:04.Ruby學習分享之哈希、集合和範圍

        本文链接:https://www.haomeiwen.com/subject/ezbqottx.html