Поиск объекта массива Ruby - PullRequest
0 голосов
/ 22 ноября 2010

Я пробую ruby, создавая нужную мне программу. У меня есть собственный класс, и мне нужен массив объектов этого класса. Этот пользовательский класс имеет некоторые атрибуты, которые меняются в ходе работы программы. Как мне найти конкретный объект в моем массиве, чтобы я мог получить к нему доступ и изменить его?

class Mathima
  attr_accessor :id, :tmimata

  def initialize(id)
    @id = id
    @tmimata = []
  end
end


# main
mathimata = []

previd = id = ""
File.read("./leit/sortedinput0.txt").lines do |line|
  array = line.split(' ')          # i am reading a sorted file
  id = array.delete_at(0)          # i get the first two words as the id and tmima
  tmima = array.delete_at(0)

  if previd != id
    mathimata.push(Mathima.new(id))  # if it's a new id, add it
  end

  # here is the part I have to go in mathimata array and add something in the tmimata array in an object. 

  previd = id
end

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Используйте хэш для математики, как указал Грег:

mathimata = {}
File.read("./leit/sortedinput0.txt").lines do |line|
  id, tmima, rest = line.split(' ', 3)
  mathimata[id] ||= Mathima.new(id)
end
2 голосов
/ 22 ноября 2010
mathima = mathimata.find{|mathima| mathima.check() }
# update your object - mathima
0 голосов
/ 22 ноября 2010

Array.find() позволяет выполнять последовательный поиск в массиве, но это плохо масштабируется.

Я бы порекомендовал, если вы имеете дело с большим количеством объектов или элементов, и они уникальны, тогда хэш будет намного лучше. Хэши разрешают индексированный поиск по ключу.

Поскольку вы сохраняете только уникальные идентификаторы, хорошим выбором будет либо Set, либо Hash:

mathimata.push(Mathima.new(id))  # if it's a new id, add it

Набор между массивом и хэшем. Это позволяет только уникальные записи в коллекции, так что это как эксклюзивный массив. Он не разрешает поиск / доступ по ключу, такому как Hash.

Кроме того, вы можете получить первые два слова более рубиноподобным способом:

array = line.split(' ')          # i am reading a sorted file
id = array.delete_at(0)          # i get the first two words as the id and tmima
tmima = array.delete_at(0)

обычно будет написано:

id, tmima = line.split(' ')[0, 2]

или

id, tmima = line.split(' ')[0 .. 1]
...