- 論壇徽章:
- 0
|
1. 如何創(chuàng)建數(shù)組?
最簡(jiǎn)單的,x=[]將創(chuàng)建一個(gè)空數(shù)組:
irb(main):004:0> x = []
=> []
另外還可以使用標(biāo)準(zhǔn)的new方法,任何數(shù)組都是Array類(lèi)的實(shí)例。
irb(main):001:0> x = Array.new
=> []
irb(main):002:0> x = Array.new(3)
=> [nil, nil, nil]
irb(main):003:0> x = Array.new(3,"a")
=> ["a", "a", "a"]
上述第一個(gè)創(chuàng)建空數(shù)組,第二個(gè)創(chuàng)建預(yù)設(shè)SIZE的數(shù)組,第三個(gè)創(chuàng)建預(yù)設(shè)SIZE和值的數(shù)組。
跟Hash一樣,第三種方法填充的預(yù)設(shè)值,都指向同一個(gè)目標(biāo)。
任何一個(gè)位置的目標(biāo)改變了,都影響所有元素的值:
irb(main):005:0> x = Array.new(3,"a")
=> ["a", "a", "a"]
irb(main):006:0> x[0] << "b"
=> "ab"
irb(main):007:0> x
=> ["ab", "ab", "ab"]
創(chuàng)建的數(shù)組,每個(gè)元素都是唯一目標(biāo),要這樣做:
irb(main):008:0> x = Array.new(3) do |e| e = "a" end
=> ["a", "a", "a"]
irb(main):009:0> x[0] << "b"
=> "ab"
irb(main):010:0> x
=> ["ab", "a", "a"]
當(dāng)然還可以如下創(chuàng)建數(shù)組:
irb(main):012:0> x = Array.[](1,2,3)
=> [1, 2, 3]
irb(main):013:0> x = Array[1,2,3]
=> [1, 2, 3]
不過(guò)很少使用,不如x=[1,2,3]來(lái)的簡(jiǎn)潔方便。
2. 如何訪(fǎng)問(wèn)數(shù)組?
使用數(shù)組下標(biāo):
irb(main):014:0> x = [3,2,1,4]
=> [3, 2, 1, 4]
irb(main):015:0> x[0]
=> 3
irb(main):016:0> x[-1]
=> 4
0表示第一個(gè)元素,-1表示最后一個(gè)元素,其他類(lèi)推。
還有first和last方法:
irb(main):017:0> x.first
=> 3
irb(main):018:0> x.last
=> 4
first和last可以帶一個(gè)整數(shù)參數(shù),表示返回首尾多少個(gè)元素。
遍歷數(shù)組使用each方法:
irb(main):024:0> x.each do |s| puts s end
1
2
3
=> [1, 2, 3]
3. 數(shù)組的slice?
數(shù)組的slice可以對(duì)數(shù)組切片,返回指定位置和長(zhǎng)度的片段。
irb(main):021:0> x[0,2]
=> [3, 2]
irb(main):022:0> x[0..2]
=> [3, 2, 1]
irb(main):023:0> x[0...2]
=> [3, 2]
第一個(gè)表述從0位置開(kāi)始切片,長(zhǎng)度為2,返回2個(gè)元素。
第二個(gè)表示從0位置開(kāi)始切片,到2位置結(jié)束,返回3個(gè)元素。
第三個(gè)表示從0位置開(kāi)始切片,到2位置結(jié)束,但是不包括最后一位,返回2個(gè)元素。
4. 如何修改數(shù)組?
數(shù)組有push和<<方法,表示添加元素到數(shù)組尾部:
irb(main):024:0> x = [3,2,1,4]
=> [3, 2, 1, 4]
irb(main):025:0> x.push(5)
=> [3, 2, 1, 4, 5]
irb(main):026:0> x << 6
=> [3, 2, 1, 4, 5, 6]
pop方法表示從尾部刪除元素,shift表示從首部刪除元素:
irb(main):027:0> x.pop
=> 6
irb(main):028:0> x.shift
=> 3
對(duì)應(yīng)的有unshift方法,表示從首部添加元素:
irb(main):029:0> x.unshift(0)
=> [0, 2, 1, 4, 5]
數(shù)組的insert方法可以在指定位置插入元素:
irb(main):053:0> x
=> [1, 2, 3]
irb(main):054:0> x.insert(1,5)
=> [1, 5, 2, 3]
當(dāng)然delete和delete_at方法可以刪除對(duì)應(yīng)的元素。
delete_at的參數(shù)是數(shù)組索引:
irb(main):021:0> x.delete_at(1)
=> 5
5. 數(shù)組的加減操作?
ruby很靈活,任何目標(biāo)都可以定義自己的方法。
數(shù)組就定義了加減方法(當(dāng)然還有乘除,不過(guò)很少使用)。
irb(main):031:0* x = [1,2,3]
=> [1, 2, 3]
irb(main):032:0> y = [4,5,6]
=> [4, 5, 6]
irb(main):033:0> z = x + y
=> [1, 2, 3, 4, 5, 6]
irb(main):034:0> z - x
=> [4, 5, 6]
所謂加就是把兩個(gè)數(shù)組合并起來(lái),所謂減就是把相同的元素排除掉。
而且這個(gè)減似乎不在意元素順序:
irb(main):043:0> x
=> [1, 2, 3]
irb(main):044:0> a
=> [3, 2, 1]
irb(main):045:0> x-a
=> []
6. 求唯一數(shù)組?
在ruby里這個(gè)很方便,用uniq方法:
irb(main):046:0> x = [1,2,3,3,2,1]
=> [1, 2, 3, 3, 2, 1]
irb(main):047:0> x.uniq
=> [1, 2, 3]
當(dāng)然x.uniq!這樣加個(gè)嘆號(hào),表示毀壞性方法,不返回而是直接改變x目標(biāo)自身。
7. 數(shù)組的比較?
可以直接用==進(jìn)行比較:
irb(main):048:0> x = [1,2,3]
=> [1, 2, 3]
irb(main):049:0> y = [3,2,1]
=> [3, 2, 1]
irb(main):050:0> x == y
=> false
irb(main):051:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):052:0> x == a
=> true
8. 數(shù)組的類(lèi)型轉(zhuǎn)換?
數(shù)組可以轉(zhuǎn)換成串,使用to_s或者join方法:
irb(main):001:0> x=[1,2,3,4]
=> [1, 2, 3, 4]
irb(main):002:0> x.to_s
=> "1234"
irb(main):003:0> x.join "-"
=> "1-2-3-4"
串也可以轉(zhuǎn)換成數(shù)組:
irb(main):012:0> str="1 2 3 4"
=> "1 2 3 4"
irb(main):013:0> str.to_a
=> ["1 2 3 4"]
這可能不是你想要的,那么執(zhí)行:
irb(main):018:0> str.split(/ /).map {|s| s.to_i}
=> [1, 2, 3, 4]
Hash可以直接轉(zhuǎn)換成二維數(shù)組:
irb(main):010:0> hash={1=>2,3=>4}
=> {1=>2, 3=>4}
irb(main):011:0> hash.to_a
=> [[1, 2], [3, 4]]
數(shù)組可以轉(zhuǎn)換成hash,見(jiàn)我前一篇帖子。
9. 如何查找數(shù)組元素?
irb(main):034:0> x = [3,2,1,4,4]
=> [3, 2, 1, 4, 4]
irb(main):032:0> x.include? 4
=> true
irb(main):035:0> x.find do |s| s == 4 end
=> 4
irb(main):036:0> x.select do |s| s == 4 end
=> [4, 4]
include?判斷是否包含該元素,返回true或false。
find找出符合條件的一個(gè)元素,返回該元素。
select找出符合條件的所有元素,返回結(jié)果也是數(shù)組。
10. 數(shù)組的排序?
使用sort:
irb(main):049:0> x = [3,1,4,0,1]
=> [3, 1, 4, 0, 1]
irb(main):050:0> x.sort
=> [0, 1, 1, 3, 4]
irb(main):052:0> x.sort.reverse
=> [4, 3, 1, 1, 0]
還有sort_by方法,接受一個(gè)block作為參數(shù),按照指定規(guī)則進(jìn)行排序。
11. 其他實(shí)用數(shù)組方法?
展開(kāi)數(shù)組:
irb(main):025:0> x = [1,2,3,[0,1,2]]
=> [1, 2, 3, [0, 1, 2]]
irb(main):026:0> x.flatten
=> [1, 2, 3, 0, 1, 2]
清空數(shù)組:
irb(main):027:0> x.clear
=> []
替換數(shù)組:
irb(main):028:0> x.replace [3,2,1]
=> [3, 2, 1]
合并數(shù)組:
irb(main):030:0> x.concat [1,2,3]
=> [3, 2, 1, 1, 2, 3]
12. 數(shù)組的inject方法?
irb(main):044:0> x = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):045:0> x.inject(0){|sum, item| sum += item}
=> 10
inject的參數(shù)0表示初始化sum,item表示遍歷每一個(gè)元素,在block里不斷自加,最后返回累計(jì)加值。
irb(main):047:0> x.inject([]){|new, item| new << -item}
=> [-1, -2, -3, -4]
上述inject作用,表示取數(shù)組的每個(gè)元素的負(fù)值,返回一個(gè)新數(shù)組。當(dāng)然用map更簡(jiǎn)潔:
irb(main):048:0> x.map {|item| -item}
=> [-1, -2, -3, -4]
map的item也表示遍歷數(shù)組元素,對(duì)元素進(jìn)行計(jì)算后,返回一個(gè)結(jié)果數(shù)組。 |
|