Ruby:Array每个循环,在新数组中保存原始数组的其他元素

时间:2013-12-01 19:57:10

标签: ruby arrays

我目前正在尝试将数组的每个元素与其他元素进行比较(在Ruby中)。这些元素是类的对象。我需要找到它们之间的相似之处。我的想法是遍历原始数组并在此循环中创建一个包含其他元素(不是外部循环之一)的新数组,然后遍历第二个数组并将每个项目与每个循环外部的项目进行比较。

这是一些伪代码:

originalArray.each{
    |origElement|
    tempArray = createNewArray from original array without origElement
    tempArray.each{
        |differentElement|
        Compare origElement with differentElement
    }
}

如何创建tempArray?

2 个答案:

答案 0 :(得分:2)

我认为您应该使用Array#permutation来实现此目标

original_array.permutation(2) { |elements| Compare elements[0] with elements[1] }

答案 1 :(得分:1)

首先,我想说bjhaid的答案是美丽的,对于你的具体实例,它应该是应该使用的。

但是,我想提供一个更一般的答案,回答你问的直接问题:“我怎样才能创建那个tempArray?”

如果您想删除原始数组中元素相等的所有值,您可以这样做:

tempArray = originalArray - [origElement]

但是,如果您只想删除该元素,则可以执行以下操作:

originalArray.each_with_index {
  |origElement, index|
  tempArray = originalArray.dup
  tempArray.delete_at(index)
  tempArray.each{
    |differentElement|
      Compare origElement with differentElement
  }
} 

另外,关于造型的说明。您可能希望对所有方法/变量使用下划线而不是CamelCase。在Ruby社区中,CamelCase通常保留用于类/模块名称。您可能还希望将“管道输入”变量(称为块参数)保留在与块开头相同的行上。它当然不是必需的,但它是Ruby社区中几乎普遍的惯例。

对于典型的Ruby开发人员来说,这段代码片段会更加熟悉和可读:

original_array.each_with_index do |orig_element, index|
  temp_array = original_array.dup
  temp_array.delete_at(index)
  temp_array.each do |different_element|
      Compare orig_element with different_element
  end
end