Ruby关于 Array 和 String 的一些实用方法

2019/03/15

Ruby关于 Array 和 String 的一些实用方法

总结了一下实际项目用到的不多,但是面试中很有用的一些方法。

总结好文


常用方法汇总

1. 常量定义

    Float::INFINITY   # 无限大
    Float::NaN        # Not a number

    float POSITIVE_INFINITY = 1.0f / 0.0f;正无穷大
    float NEGATIVE_INFINITY = -1.0f / 0.0f;负无穷大
    float NaN = 0.0f / 0.0f;表示不是一个数字
    float MAX_VALUE = 0x1.fffffeP+127f; float能表示的最大正值:3.4028235e+38f
    float MIN_NORMAL = 0x1.0p-126f; 1.17549435E-38f
    float MIN_VALUE = 0x0.000002P-126f; float能表示的最小正值 1.4e-45f
    final int MAX_EXPONENT = 127; 一个有限float数值的最大指数值
    final int MIN_EXPONENT = -126; 一个有限float数值的最小指数值
    final int SIZE = 32; 一个float类型数值占用的比特数
    final int BYTES = SIZE / Byte.SIZE; 一个float类型数值占用的字节数

2. 归并排序

# 归并排序的思想,简而言之,将数组一分为二,分别排序后合并。
class Array
  def merge_sort!
    return self if self.size <= 1
    mid = self.size / 2
    left = self[0...mid]
    right = self[mid...self.size]

    merge(left.merge_sort!, right.merge_sort!)
  end

  def merge(left, right)
    sorted = []
    until left.empty? or right.empty?
      left.first <= right.first ? sorted << left.shift : sorted << right.shift
    end

    sorted + left + right
  end
end

3. 幂运算

2 ** 2 = 4

4. ruby 值传递 or 引用传递

array = Array.new(8, Array.new(8, 0))   #这种创建二维数组的方式,二维数组的引用都是同一个

##
# 只要是块传递就可以
#
array = Array.new(8) {Array.new(8, 0)}  # 快传递

require 'matrix'
m = Matrix.zero(8).to_a

Array.new(8) {[0]*8}

5. 读取输入

gets

a = gets
p a

array

1. 多维数组降维

array.flatten

s = [ 1, 2, 3 ] #=> [1, 2, 3]
t = [ 4, 5, 6, [7, 8] ] #=> [4, 5, 6, [7, 8]]
a = [ s, t, 9, 10 ] #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
a.flatten #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 只下降一维 三维降二维
a = [ 1, 2, [3, [4, 5] ] ]
a.flatten(1) #=> [1, 2, 3, [4, 5]]

a = [ 1, 2, [3, [4, 5] ] ]
a.flatten! #=> [1, 2, 3, 4, 5]
a.flatten! #=> nil

a #=> [1, 2, 3, 4, 5]
a = [ 1, 2, [3, [4, 5] ] ]
a.flatten!(1) #=> [1, 2, 3, [4, 5]]

2. 一维数组转换成二维数组

["a", "b", "c", "d"].each_with_index.map{ |v, i| [v, i] }
["a", "b", "c", "d"].map.with_index.to_a
["a", "b", "c", "d"].each_with_index.to_a

arr = %w{a b c d}
arr.zip(0..arr.size)

#以上结果都是  [['a', 0], ['b', 1], ['c', 2], ['d', 3]]

3. array的sort方法、reverse方法、shuffle方法

>> a.sort  #数组排序
=> [8, 17, 42]
>> a.reverse  #数组反转排序
=> [17, 8, 42]
>> a.shuffle #数组随机排序
=> [17, 42, 8]

4. 将整型数组转换成字符串数组

array.map { |x| x.to_s }

5. array交集

解决步骤:

    1. 先求交集

a = array1 & array2 #=> [2, 3, 4, 8]

    1. 第一个元素被传递给块并分配给块变量:

n = 2

[2] * [array1.count(2), array2.count(2)].min

最后flat_map, 降维

注意: map 和 flat_map不同;

array1 = [2,2,2,2,3,3,4,5,6,7,8,9]

array2 = [2,2,2,3,4,4,4,4,8,8,0,0,0]

array3 = [2,2,2,3,4,8]

array1 & array2   # [2,3,4,8], 自动去重

(array1 & array2).flat_map { |n| [n]*[array1.count(n), array2.count(n)].min } #=> [2,2,2,3,4,8]  保留重复项

6. 数组全排列

class Array
  def permutations
    return [self] if size < 2
    perm = []
    each { |e| (self - [e]).permutations.each { |p| perm << ([e] + p) } }
    perm
  end
end

7. 其他常用操作

1、取数

③获取一组元素range
 >>a = [ 3,9,27,4,23,9]
 >>a[0..2]
 =>[3,9,27]
 >>a[0,3] #获取索引从0开始的3个元素
 =>[3,9,27]

④根据元素获取元素索引
 查询第一个匹配元素的索引
  a.index 9 #=>1
 查询最后一个匹配元素的索引
  a.rindex 9 #=>5

⑤取出hash数组中匹配的数(只会匹配第一个)
 ee = [{id: 1,name: 'a'},{id: 2,name: 'b'}]
 ee.find{|e| e[:id] == 1} #=> {id: 1,name: 'a'}

hash排序  sort_by
a = [{name: 'aa', t: 1},{name: 'bb', t: 3}, {name: 'cc', t: 4},{name: 'dd', t: 2}]
a.sort_by{|e| e[:t]}  #根据t升序排列
a.sort_by{|e| -e[:t]}  #根据t降序排列

8. stack,queue操作

>> a.unshift 6 # 把6添加到数组前面
=> [6, 42, 8, 17, 6]
>> a.unshift(4,5) # 把4和5添加到数组前面
=> [4, 5, 6, 42, 8, 17, 6]
>> [1,2].insert(1, 'd') #将 'd' 添加到 index为1的位置,后面的元素将向后移动
=> [1, "d", 2]

# 删除数组第一个元素,并返回这个元素。如果没有则返回nil
>> a.shift       #=>1     会改变数组的值

# 删除指定索引的元素
a.delete_at( 2 )     索引无元素则返回nil,成功则返回删除的元素

# 删除匹配的元素
a.delete 'a'     #会改变数组,若要删除的元素不存在则返回nil
a.delete('b'){ 'don't have this element'}     #若要删除的元素不存在,则执行块中的内容。

d2 = [   ["January",2007],
   ["February",2007],
   ["March",2007]  ]
# 改变数组的纵横坐标
d2.transpose     #=> [["January", "February", "March"], [2007, 2007, 2007]]

string

1. 字符串是否是数字

str.to_i.to_s == str

2. 进制转换

016进制到10进制:

>> "B0A0".hex
=> 45216

>> "B0A0".to_i(16)
=> 45216

10进制到16进制:
>> 45216.to_s(16)
=> "b0a0"


Show Disqus Comments

Post Directory