ruby array數組操作


1. 如何創建數組?

最簡單的,x=[]將創建一個空數組:

QUOTE:
irb(main):004:0> x = []
=> []


另外還可以使用標准的new方法,任何數組都是Array類的實例。

QUOTE:
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"]


上述第一個創建空數組,第二個創建預設SIZE的數組,第三個創建預設SIZE和值的數組。
跟Hash一樣,第三種方法填充的預設值,都指向同一個目標。
任何一個位置的目標改變了,都影響所有元素的值:

QUOTE:
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"]




創建的數組,每個元素都是唯一目標,要這樣做:

QUOTE:
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"]


當然還可以如下創建數組:

QUOTE:
irb(main):012:0> x = Array.[](1,2,3) 
=> [1, 2, 3]

irb(main):013:0> x = Array[1,2,3]
=> [1, 2, 3]




不過很少使用,不如x=[1,2,3]來的簡潔方便。


2. 如何訪問數組?

使用數組下標:

QUOTE:
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表示第一個元素,-1表示最后一個元素,其他類推。

還有first和last方法:

QUOTE:
irb(main):017:0> x.first
=> 3
irb(main):018:0> x.last
=> 4


first和last可以帶一個整數參數,表示返回首尾多少個元素。

遍歷數組使用each方法:

QUOTE:
irb(main):024:0> x.each do |s| puts s end
1
2
3
=> [1, 2, 3]



3. 數組的slice?

數組的slice可以對數組切片,返回指定位置和長度的片段。

QUOTE:
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]




第一個表述從0位置開始切片,長度為2,返回2個元素。
第二個表示從0位置開始切片,到2位置結束,返回3個元素。
第三個表示從0位置開始切片,到2位置結束,但是不包括最后一位,返回2個元素。


4. 如何修改數組?

數組有push和<<方法,表示添加元素到數組尾部:

QUOTE:
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表示從首部刪除元素:

QUOTE:
irb(main):027:0> x.pop
=> 6

irb(main):028:0> x.shift
=> 3


對應的有unshift方法,表示從首部添加元素:

QUOTE:
irb(main):029:0> x.unshift(0)
=> [0, 2, 1, 4, 5]


數組的insert方法可以在指定位置插入元素:

QUOTE:
irb(main):053:0> x
=> [1, 2, 3]

irb(main):054:0> x.insert(1,5)
=> [1, 5, 2, 3]


當然delete和delete_at方法可以刪除對應的元素。
delete_at的參數是數組索引:

QUOTE:
irb(main):021:0> x.delete_at(1)
=> 5


5. 數組的加減操作?

ruby很靈活,任何目標都可以定義自己的方法。
數組就定義了加減方法(當然還有乘除,不過很少使用)。

QUOTE:
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]


所謂加就是把兩個數組合並起來,所謂減就是把相同的元素排除掉。
而且這個減似乎不在意元素順序:

QUOTE:
irb(main):043:0> x
=> [1, 2, 3]

irb(main):044:0> a
=> [3, 2, 1]

irb(main):045:0> x-a
=> []


6. 求唯一數組?

在ruby里這個很方便,用uniq方法:

QUOTE:
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]



當然x.uniq!這樣加個嘆號,表示毀壞性方法,不返回而是直接改變x目標自身。


7. 數組的比較?

可以直接用==進行比較:

QUOTE:
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. 數組的類型轉換?

數組可以轉換成串,使用to_s或者join方法:

QUOTE:
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"


串也可以轉換成數組:

QUOTE:
irb(main):012:0> str="1 2 3 4"
=> "1 2 3 4"

irb(main):013:0> str.to_a
=> ["1 2 3 4"]


這可能不是你想要的,那么執行:

QUOTE:
irb(main):018:0> str.split(/ /).map {|s| s.to_i}
=> [1, 2, 3, 4]

Hash可以直接轉換成二維數組:

QUOTE:
irb(main):010:0> hash={1=>2,3=>4}
=> {1=>2, 3=>4}

irb(main):011:0> hash.to_a
=> [[1, 2], [3, 4]]


數組可以轉換成hash,見我前一篇帖子。

9. 如何查找數組元素?

QUOTE:
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找出符合條件的一個元素,返回該元素。
select找出符合條件的所有元素,返回結果也是數組。

10. 數組的排序?

使用sort:

QUOTE:
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方法,接受一個block作為參數,按照指定規則進行排序。

11. 其他實用數組方法?

展開數組:

QUOTE:
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]


清空數組:

QUOTE:
irb(main):027:0> x.clear
=> []


替換數組:

QUOTE:
irb(main):028:0> x.replace [3,2,1]
=> [3, 2, 1]

合並數組:

QUOTE:
irb(main):030:0> x.concat [1,2,3]
=> [3, 2, 1, 1, 2, 3]


12. 數組的inject方法?

QUOTE:
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的參數0表示初始化sum,item表示遍歷每一個元素,在block里不斷自加,最后返回累計加值。

QUOTE:
irb(main):047:0> x.inject([]){|new, item| new << -item}    
=> [-1, -2, -3, -4]


上述inject作用,表示取數組的每個元素的負值,返回一個新數組。當然用map更簡潔:

QUOTE:
irb(main):048:0> x.map {|item| -item}
=> [-1, -2, -3, -4]


map的item也表示遍歷數組元素,對元素進行計算后,返回一個結果數組。

 

原文鏈接地址 http://bbs.chinaunix.net/thread-1828498-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM