前面給大家留了兩道很簡單的作業
我們先來說下第一道:判斷一個字符串是否是回文
首先,不得不說,這道題很簡單,核心算法就是前面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!
网友评论