Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

class Array

 def invert

h={}

self.each_with_index{|x,i| h[x]=i}

h

 end

end

a = ["red","yellow","orange"]

h = a.invert # {"orange"=>2, "yellow"=>1, "red"=>0}

8.1.25. Синхронная сортировка нескольких массивов

Предположим, что необходимо отсортировать массив, которому соответствуют «параллельные» массивы, то есть в соответственных позициях находятся логически связанные данные. Не хотелось бы, чтобы в результате сортировки это соответствие нарушилось.

В представленном ниже решении мы сортируем массив и сохраняем получившийся набор индексов. Затем список индексов (который сам является массивом) можно применить к любому другому массиву, чтобы расставить его элементы в том же порядке.

class Array

 def sort_index

d=[]

self.each_with_index{|x, i| d[i]=[x,i]}

if block_given?

d.sort {|x,у| yield x[0],y[0]}.collect{|x| x[1]}

else

d.sort.collect{|x| x[1]}

end

 end

 def sort_with(ord=[])

return nil if self.length!=ord.length

self.values_at(*ord)

 end

end

a = [21, 33, 11, 34, 36, 24, 14]

b = a.sort_index

a2 = a.sort_with(b)

c = a.sort_index {|x,y| x%2 <=> y%2 }

a3 = a.sort_with(c)

p a # [21, 33, 11, 34, 36, 24, 14]

p b # [2,6,0,5,1,3,4]

p a2 # [11, 14, 21, 24, 33, 34, 36]

p c # [6, 5, 4, 3, 2, 1, 0]

p a3 # [14, 24, 36, 34, 11, 33, 21]

8.1.26. Указание значения по умолчанию для новых элементов массива

Когда массив растет и в нем создаются новые элементы, по умолчанию им присваивается значение

nil
:

a = Array.new

a[0]="x"

a[3]="y"

# а равно ["x", nil, nil, "y"]

Но, допустим, нам требуется, чтобы новые элементы получали другое значение. Тогда в качестве конкретного применения общего принципа предлагаем класс

ZArray
, описывающий массив, в котором вновь созданные элементы будут равны 0:

class ZArray < Array

 def [](x)

if x > size

for i in size+1..x

self[i]=0

end

end

v = super(x)

 end

 def []=(x,v)

max = size

super(x,v)

if size - max > 1

(max..size-2).each do |i|

self[i] = 0

end

end

 end

end

num = Zarray.new

num[1] = 1

num[2] = 4

num[5] = 25

# num равно [0, 1, 4, 0, 0, 25]

8.2. Хэши

Хэши еще называют ассоциативными массивами, словарями и т.д. Особенно хорошо эта структура данных знакома программистам на языках Perl и Java.

Массив можно представить как структуру, которая создает ассоциацию между индексом 

x
и элементом данных
y
. Хэш тоже создает подобную ассоциацию, но с двумя отличиями. Во-первых, в случае с массивом
x
— целое число, а для хэша это не обязательно. Во-вторых, массив — упорядоченная структура, тогда как элементы хэша обычно располагаются в непредсказуемом порядке.

  • Читать дальше
  • 1
  • ...
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: