2009-05-14 6 views
3

나는 삶의 문제로 해결할 수없는 문제가 있습니다. 저는 콘서트홀 티켓을 판매하는 Ruby 앱 (8 년 동안 PHP 개발자였습니다. Ruby를 시작으로)을 작성하고 있습니다. 각 좌석에는 행 (a ... z)과 숫자 (1 ... x)가 있습니다. 데이터베이스 모델에는 각 좌석에 대한 행 (문자열)과 num (int)이 있습니다.Ruby - 2 차원 배열의 정수로 문자 매핑

어떻게 데이터베이스의 배열을 2 차원 배열로 변환 할 수 있습니까? 예를 들어, 좌석 A1은 좌석 [1] [1] = "value"; 좌석 C4는 좌석 [3] [4] = 값으로 매핑됩니다. 문제는 행 문자열을 Ascii로 변환하고 오프셋을 뺍니까? 아니면 더 쉬운 방법이 있습니까?

많은 감사합니다.

+0

왜 행을 정수로 변환합니까? 대신에 문자열을 넣을 수 있습니다. –

+0

감사합니다. Matt. 내가 너를 잡을 수 있을지 모르겠다. 내가 시도하고 좌석을 할 경우 [seat.row] [seat.num] = value TypeError String을 Integer로 변환 할 수 없습니다. 따라서 배열은 정수로만 인덱싱되므로 변환이 필요하다고 가정 했습니까? –

+0

@ Dan : Ruby는 PHP의 연관 배열과 거의 같은 해시를 가지고 있습니다. 그들은 배열과 같은 방식으로 색인이 생성되지만 (내 대답 참조) 빈 해시는 [] 대신 {}로 표시됩니다. – Pesto

답변

4

가장 간단한 방법은 대신 해시를 사용하는 것입니다. 예 : seat['A'][1] = value

그러나 실제로 어떤 이유로 배열이 필요한 경우 설명하는 방법이 가장 간단합니다. 행 문자열이 'A'에서 'Z'까지의 단일 문자라고 가정하면 row_string[0] - ?A (또는 예에서와 같이 1에서 시작하는 색인을 원할 경우 row_string[0] - ?A + 1)을 사용하여 행 문자열을 처리 할 수 ​​있습니다. 행 AA는 행 Z 이후 멀티 문자 버전의 경우는 1.8.7 및 최신에서이 작업을 수행 할 수 있습니다

row_num = row_string.bytes.inject(0) {|total, x| total = total * 26 + x - ?A + 1} 

당신은, 사전에 행 문자열을 upcase 단지 안전을 위해 할 수 있습니다.

1.8.6 이하에서는 Stringbytes 메서드가 없습니다. 당신은 수행하여 같은 일을 수행 할 수 있습니다

row_num = 0 
row_string.each_byte {|x| row_num = row_num * 26 + x - ?A + 1} 
+0

동의합니다. 해시가이를 처리하는 가장 좋은 방법입니다. –

+0

정말로 감사드립니다. 해시는 확실히 가장 쉬운 방법입니다. 그러나 : \t 아웃은 [seat.num] seat.row] = "예" 단부 복귀 아웃 가 오류를 생성 = {} self.seats 좌석 용 아웃은 전무를 평가하는 동안 발생 [] =. . seat.row와 seat.num 모두 값을 주장 했으므로 구문 오류가 있어야합니다. 도움 주셔서 감사합니다. –

+0

구문 오류가 아니므로 요소를 할당하기 전에 각 행에 대한 배열을 만들어야합니다. 이것을 시도하십시오 : outs = {}; self.seats의 좌석; outs [seat.num] || = []; outs [seat.num] [seat.row] = "yes"; end "outs [seat.num] || = []"행은 아직 값이 없으면 [seat.num]을 빈 배열로 설정합니다. 또한 "예"대신 "true"를 사용하는 것이 더 나을 것입니다. – Pesto

1

그럼 내가 배열에 알이

을 반환이

('A'..'Z').to_a.index('C') 

처럼 뭔가를 할 수있는 문자의 인덱스를 얻을 수 당신이 준 예제는 0 대신 A = 1을 시작했습니다.

2

좋아요, 그 해결책은 제가 생각한 것입니다 :

seat_array = Hash.new{|h,k| h[k]=Hash.new(&h.default_proc) } 
for seat in self.seats 
seat_array[seat.row.downcase][seat.num] = seat 
end 
return seat_array 

이렇게 빠르고 유용한 답변을 보내 주신 모든 분들께 감사드립니다. 나는 확실히 PHP로 다른 사람들을 도울 것입니다!

관련 문제