美文网首页Ruby & Rails程序员Ruby
03.Ruby學習分享之符號和數組

03.Ruby學習分享之符號和數組

作者: 清水川崎 | 来源:发表于2017-03-23 21:10 被阅读37次

前面給大家留了兩道很簡單的作業

我們先來說下第一道:判斷一個字符串是否是回文

首先,不得不說,這道題很簡單,核心算法就是前面02講到的其中一個方法,字符串的翻轉方法——reverse方法。所以你只需要判斷字符串翻轉前後是否一致就行。

代碼如下:

def text?(str)

p (str.reverse ==str)?"是回文":"不是回文"

end

(def end這樣一對表示我們是在寫一個方法,後續文章會提到。中間寫我們的方法體。前面說了判斷類型會返回一個bool值,於是方法命名的時候要加一個?,但是為了明顯,我們就直接打印好了。我們這裡使用了三元運算符,而不是使用if-else這樣計算機計算效率更高!str表示的是參數,這裡用來代指我們輸入的字符串。

接著說下第二道題:找出一個字符串偶數位的字母

這道題的核心了,為兩個方法,任選其一,一種是判斷是否是奇數odd?方法,另外一種判斷是否是偶數方法even?方法。

代碼如下:

def text_odd(str)

for i in 0...str.length

p str[i] if i.odd? ==true

end

end

這裡我們使用了一個for in循環,它的作用是遍歷字符串,我們定義的範圍是0到字符串長度的開區間。為什麼是開區間了?

那是因為假如字符串長度為6,你取a[6]那肯定是一個nil值。我們只要判斷i是不是奇數就行。這裡下標是從0開始,就是說奇數1,實際上對應的是第二個數字,3對應的是第四個數字,所以也可以判斷不是偶數也行。


說完上一次的作業,我們說一下今天的內容,符號和數組

數組可以採用如下聲明,直接聲明

a= [1,2]

也可以使用new方法定義,也叫實例化方法,實例也叫對象,因為每new一下就是一個新的對象或者一個新的實例

b = Array.new(3,'ddd')

不過使用這種方式定義的數組,裡面每一個下標都只是一個refres,都指向同一個內存區域,內存地址一致,並且一個被改變,全部都被改變。我們可以打印下各個下標的內存地址

p b[0].object_id,b[1].object_id,b[2].object_id

refres可以看做一個標識,比如實體其實是小明,在家裡他是兒子,在學校他是班長,但是學校的班長要是死掉了,那麼家裡的兒子也就死掉了,因為兩種不同的稱號都對於小明這同一個實體。

如何定義內容下同但下標獨立的數組了?

其實很簡單,我們可以使用block定義

a=Array.new(3) {'asdf'}

我們可以打印下它們的內存地址

pa[0].object_id,a[1].object_id,a[2].object_id

Ruby中的數組,數字、字符串可以在一起,比如有一個數組['a',32]

Ruby還有定義字符串數組的方法

%w(foo bar wut wat)

這樣就不用加引號還有逗號


接下來說下數組的一些常用方法

# 取數組中的第一個元素

p arr[0]

# 取數組中的最後一個元素

p arr[-1]

# 取某個區間的元素

p arr[1..2]

# 安全的通過下標取值 不會返回nil,還可以設立缺省值

p arr.fetch(4,'normal')

# 求數組的長度

p  arr.length

# 判斷數組是否包含某個元素

p arr.include? 'foo'

# 判斷數組是否為空

p arr.empty?

# 推送一個值到數組末尾

arr.push'ber'

p arr

前面我們提到了<<,還記得嗎?在說超長字符串的時候,其實這裡也可以用來為數組添加元素。比如:

arr << 'abc'

# 添加某個下標以後,下標和前面沒有的值會自動被補全為nil

arr[7] ='asdf'

p arr

# 根據下標刪除元素

arr.delete_at 0

p arr

# 根據內容刪掉元素(注意:假如很多內容相同,那麼都會被刪掉)

arr.delete 'wat'

p arr

# 去除數組中的重複內容

p arr.uniq

# 隨機打亂數組的順序

p arr.shuffle

# 數組展平(二維數組變一維數組)

arr= [[1,2],[3,4],[5,6,7],[9,10,11,12]]

p arr.flatten

# 注意:uniq、shuffle、flatten在這裡都有!方法,使用!方法會改變自身

# Array的block簡單用法

# 1.遍歷array

c= [1,2,3,4,5,6,7,9,10,11,12]

c.each {|i|

p i

}

# 倒序遍歷

c.reverse_each {|i|

p i

}

# 下標和內容一起遍歷

c.each_with_index {|e,i|

p [e,i]

}

# 對arr排序

# sort方法不加block使用時默認按從小到大排序

# 添加block以後傳入兩個參數,第一個參數表示小的,第二個表示大的,

# 大的放在<=>前就表示從大到小排序,反之為從小到大

p c.sort {|x,y|

y<=>x

}

p c.sort {|x,y|

x<=>y

}

# array選擇某些滿足條件內容的方法

p c.select {|x|

x>7

}

上面就只會打印數組中大於7的內容

# 去除Array中的nil

c [13] =99

p c

p c.compact

# 判斷是否包含滿足某個條件的內容存在

p c.any? {|x|

x>10

}


還是給大家留道作業

# 輸入:input 輸出output

input 為 [1,2,3],output為[2,4,6]

要求:

1.不能改變原input

2.output是一個新的array object

提示:可以使用迭代器each,不過建議使用map迭代器,因為這樣更簡潔更ruby!

相关文章

网友评论

    本文标题:03.Ruby學習分享之符號和數組

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