2012-11-21 4 views
0

초급 질문 :분할 Fixnum의 최소/최대 찾기? (루비)

나는 다음과 같은 코드가 있습니다

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

의 모든 종류의 최소/최대/[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 
+1

허 :

방법 min_max_by는 (배열 등) 모든 enumerables 사용할 수있다? 그래서'difference'는 정수 여야합니다 (두 정수의 차이이기 때문에)하지만 문자열 표현을 공백으로 분리하려고합니까? 정수에 공백이있는 이유는 무엇입니까? – maerics

답변

1

문제는 Fixnum 관련이 없습니다. 결과를 배열을 모두 처리 할 수있는 배열로 옮기지 않기 때문입니다. - 한 번에 하나의 결과 만 처리하는 것입니다. 이것은 당신을 위해 작동합니다 : 이것은 무엇을

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

은 '매핑'새로운 배열의 요소로 각 데이터 행의 차이에 의해 새로운 배열을 구축합니다. 그런 다음 새 배열에서 .min을 호출하여 최소 요소를 찾습니다.

+0

나는 코드를 출력 할 때 [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] 배열의 첫 번째를 들여다 볼 때, 29 번, 30 번 반복됩니다. – user1832897

0

Ruby Enumerable#mapEnumerable#reduce methods (둘 다 배열에 사용 가능)을 보면 배열을 필요한 것으로 변형 할 수 있습니다.

예를 들어, 여기 당신이 "감소"를 사용하여 한 번에 최소 및 최대 모두를 찾을 수있는 방법입니다

그 시점에서
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} 
+1

또는 Enumerable의'minmax' 메소드를 사용하십시오. –

0
difference_string = difference.to_s.split(" ") 

, difference는 정수 (20)이다. 공백으로 분리 된 문자열 ("20")로 변환됩니다. 문자열에 공백이 없기 때문에 결과는 [ "20"]과 같을 것입니다. 이는 하나의 요소가있는 배열입니다. 그걸 '.min'이라고하면 "20"이됩니다. 라인 엔딩없이 인쇄 할 수 있습니다.

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

어떤 이유로 코드를 작성할 때 30 행 3 열 인쇄물이 생깁니다. 이것은 내가 시도한 다른 프로세스와 동일합니다. 왜 그런지에 대한 의견이 있습니까? 감사! – user1832897

+0

이전 코드 줄을 맨 위에 추가했습니다. – user1832897