본인은 헬퍼 코드 여야하며보기에 포함되어서는 안된다는 데 동의합니다.
map = {
"Alberta" => ["Calgary", "Edmonton"],
"Manitoba" => ["Winnipeg"],
"Ontario" => ["Hamilton", "Kitchener", "Ottawa", "Toronto", "Waterloo"],
"Quebec" => ["Hull", "Laval", "Montreal"]
}
그것은 약 2 열을 생각하여 시작하는 것이 더 쉽습니다 :
는 해시에서 지방 간 도시지도를 가정하자. 2 열의 경우 첫 번째 열을 중단 할 위치를 결정하고 2 열을 시작합니다. 이 데이터에는 알버타와 매니토바, 매니토바와 온타리오, 온타리오와 퀘벡의 3 가지 선택 사항이 있습니다.
: 우리는이 열을 만들 수 있습니다
def split(items, indexes)
if indexes.size == 0
return [items]
else
index = indexes.shift
first = items.take(index)
indexes = indexes.map { |i| i - index }
rest = split(items.drop(index), indexes)
return rest.unshift(first)
end
end
그런 다음 우리는 여러 가지 방법을 모두 볼 수 있습니다 :
그래서 우리는 한 번에 여러 장소에서 목록을 분할 할 수 있도록의 함수를함으로써 시작하자
require 'pp' # Pretty print function: pp
provinces = map.keys.sort
1.upto(provinces.size - 1) do |i|
puts pp(split(provinces, [i]))
end
=>
[["Alberta"], ["Manitoba", "Ontario", "Quebec"]]
[["Alberta", "Manitoba"], ["Ontario", "Quebec"]]
[["Alberta", "Manitoba", "Ontario"], ["Quebec"]]
또는 우리는 우리가 3 열 수있는 여러 가지 방법을 볼 수 있습니다 : 당신이 한 번
1.upto(provinces.size - 2) do |i|
(i+1).upto(provinces.size - 1) do |j|
puts pp(split(provinces, [i, j]))
end
end
=>
[["Alberta"], ["Manitoba"], ["Ontario", "Quebec"]]
[["Alberta"], ["Manitoba", "Ontario"], ["Quebec"]]
[["Alberta", "Manitoba"], ["Ontario"], ["Quebec"]]
을 이 작업을 수행 할 수 있습니다. 열이 가장 균일 한 높이의 배열을 찾을 수 있습니다.
:
def column_height(map, provinces)
provinces.clone.reduce(0) do |sum,province|
sum + map[province].size
end
end
그런 다음 당신이 가장 높은과 짧은 열 사이의 최소한의 차이로 3 열 레이아웃을 찾기 위해 전에서 루프를 사용할 수 있습니다 : 우리는 컬럼의 높이를 찾을 수있는 방법을 원 할거야
def find_best_columns(map)
provinces = map.keys.sort
best_columns = []
min_difference = -1
1.upto(provinces.size - 2) do |i|
(i+1).upto(provinces.size - 1) do |j|
columns = split(provinces, [i, j])
heights = columns.map {|col| column_height(map, col) }
difference = heights.max - heights.min
if min_difference == -1 or difference < min_difference
min_difference = difference
best_columns = columns
end
end
end
return best_columns
end
그것은 당신에게 각 열에 대한 목록을 제공합니다 :
puts pp(find_best_columns(map))
=>
[["Alberta", "Manitoba"], ["Ontario"], ["Quebec"]]
당신이 어떤 지역이 독립적으로 모델 구조의 각 열에 속하는 알아 내기 때문에 큰이며, 세대하지 않습니다 HTML을 직접 erate하십시오.따라서 모델과 뷰가 모두 변경 될 수 있지만 여전히이 코드를 재사용 할 수 있습니다. 이 함수는 자체 포함되어 있기 때문에 단위 테스트를 쉽게 작성할 수 있습니다. 4 개의 열의 균형을 유지해야하는 경우 find_best_columns 함수를 조정하거나 n 열을 지원하도록 재귀 적으로 다시 작성할 수 있습니다. 여기서 n은 다른 매개 변수입니다.
감사합니다. Harold. 이것은 멋지다! –