找到分割Fixnum的最小值/最大值? (红宝石)

时间:2012-11-21 20:59:47

标签: ruby

初学者问题:

我有这样的代码:

p true_columns
=> [["1", "88", "59"], ["2", "79", "63"], ["3", "77", "55"], ["4", "77", "59"], ["5", "90", "66"], ["6", "81", "61"], ["7", "73", "57"], ["8", "75", "54"], ["9", "86", "32*"], ["10", "84", "64"], ["11", "91", "59"], ["12", "88", "73"], ["13", "70", "59"], ["14", "61", "59"], ["15", "64", "55"], ["16", "79", "59"], ["17", "81", "57"], ["18", "82", "52"], ["19", "81", "61"], ["20", "84", "57"], ["21", "86", "59"], ["22", "90", "64"], ["23", "90", "68"], ["24", "90", "77"], ["25", "90", "72"], ["26", "97*", "64"], ["27", "91", "72"], ["28", "84", "68"], ["29", "88", "66"], ["30", "90", "45"]]

我的问题是能够将这些数据拆分成一个列表,并且能够找到大集合中每个数组的第二个和第三个值之间差异的最小值/最大值。不是最干净的代码,而是忍受我:

true_columns.each do |data|
  difference = data[1].to_i - data[2].to_i
  difference_string = difference.to_s.split(" ")
  print difference_string
end
=> ["29"]["16"]["22"]["18"]["24"]["20"]["16"]["21"]["54"]["20"]["32"]["15"]["11"]["2"]["9"]["20"]["24"]["30"]["20"]["27"]["27"]["26"]["22"]["13"]["18"]["33"]["19"]["16"]["22"]["45"]

任何类型的min / max / [x]命令都会返回一些内容,将“difference_string”减少为更基本的内容,连接原始的difference_string。例如:

print difference_string.min  
=> 2916221824201621542032151129202430202727262213183319162245

我认为这与Fixnum形式的原始变量有关,我不知道如何将其转换为列表,我可以用它来拉动像difference_string.min这样的东西。另外,如果有人能给我解释为什么min / max命令将数据减少到上面的形式,那就太棒了。

编辑:

作为参考,我在顶部的代码是:

file = File.open("file.dat")
columns = []
file.each_line do |line|
  p line 
  columns << line.split(" ")[0 , 3]
end

3 个答案:

答案 0 :(得分:1)

问题与Fixnum无关。这是因为您没有将结果移动到可以处理所有结果的数组中 - 而是您一次只处理一个结果。这应该适合你:

true_columns.map{|data| data[1].to_i - data[2].to_i}.min

这样做是通过将每个数据行的差异“映射”为新数组中的元素来构建新数组。然后,在新阵列上调用.min以查找最小元素。

答案 1 :(得分:0)

查看Ruby Enumerable#mapEnumerable#reduce methods(它们都可用于数组),它们将帮助您将数组转换为您需要的数组。

例如,以下是使用“reduce”在一次传递中找到min和max的方法:

min_max = true_columns.reduce({}) do |acc, data|
  diff = data[1].to_i - data[2].to_i
  acc[:min] = diff if (!acc[:min] || (diff < acc[:min]))
  acc[:max] = diff if (!acc[:max] || (diff > acc[:max]))
  acc
end
min_max # => {:min=>2, :max=>54} 

答案 2 :(得分:0)

difference_string = difference.to_s.split(" ")

此时,difference是一个整数(20)。它被转换为一个字符串(“20”),它被分割在一个空格中。由于字符串中没有空格,结果将类似于[“20”],这是一个包含一个元素的数组。 在其上调用'.min'将导致"20"。打印,打印,打印,没有行结束。

所有可用数据(如数组)都有一个方法min_max_by

min_col, max_col = true_cols.minmax_by{|data| data[1].to_i - data[2].to_i} #["14", "61", "59"] and ["9", "86", "32*"]