Ruby - 从基于Parameter的数组数组中删除

时间:2015-11-11 21:54:35

标签: arrays ruby

我正在尝试编写一个函数,该函数将从一个数组中具有匹配字符串名称的3d数组中删除一个数组。

before(:each) do
  @topic1 = Topic.new 4,'topic 1'
  @topic2 = Topic.new 7,'topic 2'
  @topic3 = Topic.new 5,'topic 3'
  @subject = Subject.new 'Module 1',2,5
end

参数是No_of_Lectures和Name

@topics = [5,'Topic1'], [3,'Topic2'], [5,'Topic3']  

基本上我想删除Name =' Topic1'如果它不在列表中,则返回null。

到目前为止我所拥有的是

def findTopic name
  @topics.find {|topic| topic.name == name }
end


def removeTopic name_in
  if @topics.findTopic(name)
    @topics.delete_if {|key, name| name == name_in } 
    topic
  else
    null
  end
end

1 个答案:

答案 0 :(得分:3)

  

一个3d数组

你的阵列是二维的。

  

如果不在列表中,则返回null。

红宝石中不存在

null - 但是nil

def remove(target, array2D)

  results = array2D.reject do |arr|
    arr.last == target
  end

  results.size == array2D.size ? nil : results
end

test_arrays = [
  [[5,'Topic1'], [3,'Topic2'], [5,'Topic3']],
  [[5,'Topic4'], [3,'Topic5'], [5,'Topic6']]
]

test_arrays.each do |array2D|
  p remove('Topic2', array2D)
end

--output:--
[[5, "Topic1"], [5, "Topic3"]]
nil

另一方面,这个问题的解决方案:

  

从列表中删除主题。返回删除的主题;除此以外,   当主题当前不在列表中时返回null。

是:

def remove(target, array2D)

  array2D.each_with_index do |arr, index|
    if arr.last == target
      array2D.delete_at(index)
      return arr
    end
  end

  return nil

end

test_arrays = [
  [[5,'Topic1'], [3,'Topic2'], [5,'Topic3']],
  [[5,'Topic4'], [3,'Topic5'], [5,'Topic6']]
]

test_arrays.each do |array2D|
  p remove('Topic2', array2D)
end

--output:--
[3, "Topic2"]
nil