0

初心者の質問:

次のようなコードがあります。

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"]]

私の問題は、このデータをリストに分割し、大きなセット内の各配列の 2 番目と 3 番目の値の差の最小/最大を見つけることができるようにすることです。最もきれいなコードではありませんが、我慢してください:

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 のようなものを引き出すことができます。また、最小/最大コマンドがデータを上記の形式に縮小する理由を誰かが説明してくれたら、それは素晴らしいことです。

編集:

参考までに、上部の私のコードは次のとおりです。

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

3 に答える 3

1

問題は とは関係ありませんFixnum。これは、すべての結果を処理できる配列に結果を移動するのではなく、一度に 1 つの結果を処理しているためです。これはあなたのために働くはずです:

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

これが行うことは、各データ行の違いを新しい配列の要素として「マッピング」することにより、新しい配列を構築することです。.min次に、新しい配列を呼び出して最小要素を見つけます。

于 2012-11-21T21:05:00.887 に答える
0
difference_string = difference.to_s.split(" ")

その時点で、differenceは整数 (20) です。スペースで分割された文字列 ("20") に変換されます。文字列にスペースがないため、結果は ["20"] のような 1 つの要素を持つ配列になります。その上で「.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*"]
于 2012-11-21T21:45:51.013 に答える
0

RubyEnumerable#mapEnumerable#reduceメソッド(どちらも配列で使用可能) を見てください。これらは、配列を必要なものに変換するのに役立ちます。

たとえば、「reduce」を使用して 1 回のパスで最小値と最大値の両方を見つける方法を次に示します。

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} 
于 2012-11-21T21:17:17.713 に答える