Ruby 成对组合数组元素

Ruby 成对组合数组元素,ruby,arrays,Ruby,Arrays,我有一个如下所示的数组: booklist = [000A,000B,000C] 我希望将所有元素成对组合,以便这是输出数组: combinedbooks = [000A|000B, 000A|000C, 000B|000C] 我所做的工作如下: combinedbooks= Array.new for i in 0..booklist.length for j in i+1..booklist.length

我有一个如下所示的数组:

booklist = [000A,000B,000C]
我希望将所有元素成对组合,以便这是输出数组:

combinedbooks = [000A|000B, 000A|000C, 000B|000C]
我所做的工作如下:

combinedbooks= Array.new
    for i in 0..booklist.length
        for j in i+1..booklist.length                  
            combinedbooks.push(booklist(i) + "|" + booklist(j))
        end
    end
它不工作,我不知道为什么

booklist=['000A','000B','000C']
booklist = ['000A', '000B', '000C']
joined_booklist = []
booklist.each_with_index do |book, i|
   next if i == (booklist.length - 1)
  ((i+1)..(booklist.length-1)).each do |j|
     joined_booklist << book + "|" + booklist[j]
  end
end
已加入的书籍列表=[] booklist.each_与索引do|book,i| 如果i==(booklist.length-1),则下一步 ((i+1)…(书单长度-1))。每个都有|
joined_booklist嵌套for循环的替代方法是使用:


下面是另一个带有
until循环的解决方案

booklist = ["000A","000B","000C"]

# duplicate the array
booklist_dup = booklist

result_array = []

until booklist_dup.empty?
  # takes the first element out of the array
  first_el = booklist_dup.shift

  # create a combination with each element of the remaining array
  booklist.each{ |el| result_array << first_el + "|" + el}
end

# => ["000A|000B", "000A|000C", "000B|000C"]
booklist=[“000A”、“000B”、“000C”]
#复制数组
booklist\u dup=booklist
结果_数组=[]
直到书单空了?
#从数组中取出第一个元素
第一次=书目重复移位
#创建与剩余数组的每个元素的组合
图书列表。每个{el | result|u数组[“000A | 000B”,“000A | 000C”,“000B | 000C”]
对这种行为使用数组组合:

booklist = ['000A', '000B', '000C']
booklist.combination(2).map { |pair| pair.join('|') }

实际上,您编写的代码有两个问题。第一个问题是数组的特定元素应该用括号
[]
,而不是括号
()
。第二个问题是,由于Ruby中的数组是零索引的,
list[list.length]
不存在(
list[list.length-1]
是数组中的最后一个元素)。如果我们解决这两个问题,您将得到:

booklist = ["000A", "000B", "000C"]

combinedbooks = Array.new
for i in 0..booklist.length-1
  for j in i+1..booklist.length-1
    combinedbooks.push(booklist[i] + "|" + booklist[j])
  end
end
这是你想要的

不过Ruby是一种功能非常强大的语言,所以实际上有一种更简单的方法,可以使用、和的组合来实现您想要的功能:


你可以试试这样的

booklist = ['000A', '000B', '000C']
pairs = booklist.combination(2).to_a
pairs.map!{|a,b|"#{a}|#{b}"}

所需的结果应该是字符串?因此:
[“000A | 000B”,“000A | 000C”,“000B | 000C”]
。是的,我只需要一种方法将其成对组合并保存在一个数组中,以便以后可以测量组合出现的时间(我有几个书单,我有几个组合的书,我将合并并计数)在<<代码> 语句中,您需要三个,而不是两个点。使用Ruby类似的方法是使用代码<数组>组合> <代码>,接着是代码>可枚举的{ map /<代码>。将来,在选择一个答案之前考虑等待一段时间。没有匆忙。快速绘制的复选标记可以阻止其他可能更好的答案,并且是IMO。对那些仍在准备答案的人来说是一种失礼。如果你收到三份礼物,并且喜欢第一份,你会在听到其他两份礼物之前选择吗?用
替换
。to_a
。map{book_pair | book_pair。join('.')}
您就有了OP想要的结局result@TheChamp:是。此外,
.composition
是一个
枚举器
,因此当存在数千个条目时,可以使用它来处理内存占用率较低的可能性(尽管对于OP的问题,希望用作统计数据桶的标签,这不是问题)这个解决方案不错+1:)是的,OP使用了索引,但我们应该鼓励吗?最好的答案,IMO,因为你们都解释了问题并展示了更好的方法,而且都做得很好。如果我想在每个组合中添加一个[000A | 000B,1],代码会如何更改?你是说“更短、更简单的方法”只需更改给<代码> map 的块,这样它就返回了数组而不是仅仅是书本ID。因此,将是<代码> [组合。联接(“→”),1 ] < /代码>,而不是<代码>组合。连接(“^”)。如果您不理解较短的示例,您可能需要考虑阅读我链接到的文档。
booklist = ["000A", "000B", "000C"]
combinedbooks = booklist.combination(2).map{|combination| combination.join("|")}
booklist = ['000A', '000B', '000C']
pairs = booklist.combination(2).to_a
pairs.map!{|a,b|"#{a}|#{b}"}