添加项目到列表,同时避免冗余项目

时间:2014-10-03 06:36:12

标签: ruby

我是学生。我不只是在寻找答案;我关心逻辑。

add_item!方法应该有两个参数。第一个参数是要添加到列表中的项目,第二个参数是要添加项目的数组(即列表)。该方法不应添加重复项。例如,你可以从这开始:

def add_item!(item, list)
end

如果我们只是将项目铲入列表,而不必担心重复,我们可以写:

def add_item!(item, list)
  list << item
  list # this is what we return from the method
end

我们用方法命名方法因为它修改了传入的列表。如果我们不想修改该列表 - 并希望改为使用新项目返回不同的列表 - 我们能做什么?

棘手的部分是添加逻辑以确保我们不会两次添加相同的项目。 Ruby的Array类中有一个方法在这里有用:它被称为include?,接受一个参数,然后返回truefalse。例如:

[1,2,3].include?(3) #=> true
[1,2,3].include?(4) #=> false

尝试使用include?方法确定给定项目是否在给定列表中并完成add_item!实施。

我的尝试是这样的:

def add_item!(item, list)
  if list.include?(item)
    list.delete(item)
  else  
    list << item
    list # this is what we return from the method
  end
end

p add_item!("banana", ["orange"])
p add_item!("orange", ["orange"])

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你做错了什么:

如果数组包含该项目,则该项目将被删除,否则将执行 NOT 部分。因此项目将 NOT 插入,方法返回最后一个语句的返回值,即list.delete(item)

根据Array#delete

  

从self中删除所有等于obj的项目。

     

返回上次删除的项目,如果找不到匹配的项目,则返回nil。

答案 1 :(得分:1)

您接近答案:您不需要调用delete,因为这将删除列表中的现有元素。如果list.include?返回false,只需将其添加到列表中,如果为true,则不执行任何操作...

def add_item!(item, list)
  if !list.include?(item)
    list << item
  end
  list # this is what we return from the method
end