Pad массив, чтобы быть определенного размера - PullRequest
11 голосов
/ 10 апреля 2011

Вероятно, есть более эффективный и более рубиновый способ сделать это:

# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
  return a if n <= a.length
  return padleft([x] + a, n, x)
end

Что бы вы предложили?

Ответы [ 7 ]

24 голосов
/ 10 апреля 2011

Отредактировано из-за моего неправильного понимания вопроса. Предыдущая версия моего ответа дополняется с правой стороны, но вопрос был задан с левой стороны. Я исправил это соответственно. Это связано с соглашением об именах. ljust, rjust являются встроенными методами для String, и я расширил это соглашение до Array, но это соответствует padright и padleft, соответственно, в терминологии вопроса.

Деструктивные методы

def padleft!(a, n, x)
  a.insert(0, *Array.new([0, n-a.length].max, x))
end
def padright!(a, n, x)
  a.fill(x, a.length...n)
end

Было бы более естественно определить его в Array классе:

class Array
  def rjust!(n, x); insert(0, *Array.new([0, n-length].max, x)) end
  def ljust!(n, x); fill(x, length...n) end
end

Неразрушающие методы

def padleft(a, n, x)
  Array.new([0, n-a.length].max, x)+a
end
def padright(a, n, x)
  a.dup.fill(x, a.length...n)
end

или

class Array
  def rjust(n, x); Array.new([0, n-length].max, x)+self end
  def ljust(n, x); dup.fill(x, length...n) end
end
5 голосов
/ 24 апреля 2013

FWIW:

def rpad(item, padding, num)
  Array(item).fill padding, Array(item).size, num
end
# rpad "initialize value(s)", 0, 3
# => ["initialize value(s)", 0, 0, 0]
4 голосов
/ 10 апреля 2011

Используя 10 для длины, к которой вы добавляете, и 'x', чтобы быть к тому, к чему вы добавляете, это заполнение справа:

>> asdf = %w[0 1 2 3 ] #=> ["0", "1", "2", "3"]
>> asdf += (asdf.size < 10) ? ['x'] * (10 - asdf.size) : [] #=> ["0", "1", "2", "3", "x", "x", "x", "x", "x", "x"]

или

>> asdf = (asdf.size < 10) ? ['x'] * (10 - asdf.size) + asdf : asdf #=> ["x", "x", "x", "x", "x", "x", "0", "1", "2", "3"]

до лопатки

Если для вас имеет смысл использовать Arkey:

class Array
  def pad_right(s, char=nil)
    self + [char] * (s - size) if (size < s)
  end

  def pad_left(s, char=nil)
    (size < s) ? [char] * (s - size) + self : self
  end
end

%w[1 2 3].pad_right(5, 'x') # => ["1", "2", "3", "x", "x"]
%w[1 2 3].pad_left(5, 'x') # => ["x", "x", "1", "2", "3"]
2 голосов
/ 10 апреля 2011

Использование оператора * для повторения списка.

# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
  return a if n <= a.length
  return [x] * (n - a.length) + a
end
1 голос
/ 06 апреля 2014

Возможно больше Рубиново ;)

# Pad array to size n by adding x's. Don't do anything if n <= a.length.
def padleft(a, n, x)
  (n - a.size).times.inject(a) do |array, i|
    array << x
  end
end
1 голос
/ 29 августа 2013

Вот еще одна забавная строчка, чтобы сделать это:

(неразрушающий)

def padleft(a, n, x)
  a.dup.reverse.fill(x, a.length..n-1).reverse
end

(деструктивный)

def padleft(a, n, x)
  a.reverse.fill(x, a.length..n-1).reverse
end
0 голосов
/ 24 октября 2014

Если вы используете Rails и хотите заполнить справа:

[1,2,3,4,5,6].in_groups_of(4)
=> [[1, 2, 3, 4], [5, 6, nil, nil]]

Это не совсем близко к ответу на вопрос, но это то, что мне в конечном итоге понадобилось после посещения этой страницы.Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...