2 차원 배열을 만들고 Ruby에서 하위 배열에 액세스
2 차원 배열을 만들고 그 안에있는 가로 또는 세로 하위 배열에 빠르게 액세스 할 수있는 가능성이 있는지 궁금합니다.
다음과 같은 경우 수평 하위 배열에 액세스 할 수 있다고 생각합니다.
x = Array.new(10) { Array.new(20) }
x[6][3..8] = 'something'
그러나 내가 이해하는 한 다음과 같이 액세스 할 수 없습니다.
x[3..8][6]
이 제한을 피하거나 해킹하려면 어떻게해야합니까?
2 차원 Arrays
구현 방식 에는 몇 가지 문제가 있습니다.
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error
Hash
같이 Array
나는 Hashes
다차원 에 사용하는 것을 선호 합니다Arrays
a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42
이것은 열이나 행을 수동으로 만들 필요가 없다는 장점이 있습니다. 해시에 삽입하는 것은 거의 O (1) 이므로 너무 커지지 않는 한 여기에는 단점이 없습니다 Hash
.
지정되지 않은 모든 요소에 대해 기본값을 설정할 수도 있습니다.
a= Hash.new(0)
이제 하위 배열을 얻는 방법에 대해
(3..5).to_a.product([2]).collect { |index| a[index] }
[2].product((3..5).to_a).collect { |index| a[index] }
(a..b).to_a
O (n)에서 실행됩니다. 에서 요소를 검색하는 Hash
것은 거의 O (1)이므로 수집은 거의 O (n)에서 실행됩니다. n 개의 요소를 복사하는 것은 항상 O (n)이기 때문에 O (n)보다 빠르게 만들 수있는 방법은 없습니다.
Hashes
너무 커지면 문제가 생길 수 있습니다. 따라서 Array
데이터 양이 커지고 있다는 것을 알고 있다면 이와 같은 다차원 구현에 대해 두 번 생각할 것 입니다.
rows, cols = x,y # your values
grid = Array.new(rows) { Array.new(cols) }
요소에 액세스하는 것과 관련하여이 문서는 원하는 방식으로 배열을 캡슐화하는 단계별 방법에 매우 적합합니다.
실제 목표를 밝히지 않았지만 도움이 될 수 있습니다.
require 'matrix' # bundled with Ruby
m = Matrix[
[1, 2, 3],
[4, 5, 6]
]
m.column(0) # ==> Vector[1, 4]
(벡터는 배열처럼 작동합니다)
또는 원하는대로 유사한 표기법을 사용합니다.
m.minor(0..1, 2..2) # => Matrix[[3], [6]]
다음은 3D 배열 사례입니다.
class Array3D
def initialize(d1,d2,d3)
@data = Array.new(d1) { Array.new(d2) { Array.new(d3) } }
end
def [](x, y, z)
@data[x][y][z]
end
def []=(x, y, z, value)
@data[x][y][z] = value
end
end
다른 Ruby 배열과 마찬가지로 각 배열의 하위 섹션에 액세스 할 수 있습니다. @data [0..2] [3..5] [8..10] = 0 등
x.transpose[6][3..8]
또는 x[3..8].map {|r| r [6]}
당신이 원하는 것을 줄 것입니다.
예:
a = [ [1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[21, 22, 23, 24, 25]
]
#a[1..2][2] -> [8,13]
puts a.transpose[2][1..2].inspect # [8,13]
puts a[1..2].map {|r| r[2]}.inspect # [8,13]
I'm quite sure this can be very simple
2.0.0p247 :032 > list = Array.new(5)
=> [nil, nil, nil, nil, nil]
2.0.0p247 :033 > list.map!{ |x| x = [0] }
=> [[0], [0], [0], [0], [0]]
2.0.0p247 :034 > list[0][0]
=> 0
a = Array.new(Array.new(4))
0.upto(a.length-1) do |i|
0.upto(a.length-1) do |j|
a[i[j]] = 1
end
end
0.upto(a.length-1) do |i|
0.upto(a.length-1) do |j|
print a[i[j]] = 1 #It's not a[i][j], but a[i[j]]
end
puts "\n"
end
Here is the simple version
#one
a = [[0]*10]*10
#two
row, col = 10, 10
a = [[0]*row]*col
Here is an easy way to create a "2D" array.
2.1.1 :004 > m=Array.new(3,Array.new(3,true))
=> [[true, true, true], [true, true, true], [true, true, true]]
'programing' 카테고리의 다른 글
Google Maps API v3의 모든 정보 창을 닫습니다. (0) | 2020.11.13 |
---|---|
pcre 지원으로 uwsgi 다시 빌드 (0) | 2020.11.13 |
iPhone의 최소 버튼 크기 (0) | 2020.11.13 |
std :: string을 QString으로 변환 (0) | 2020.11.13 |
Hibernate Criteria vs HQL : 어느 것이 더 빠릅니까? (0) | 2020.11.13 |