[RUBY] Cuntom column sort function on Two-dimensional array

루비로 코딩하던 중 귀찮은 일이 있었습니다. 바로 array에 대한 정렬 중 2차원 이상 배열에서는 제가 지정한 열을 기준으로 정렬할 수 있는 함수가 없던것입니다..

대체로 sort 메소드를 이용하여 정렬을 합니다. 2차원 배열에 대해 sort 메소드를 사용하면 array는 맨 앞 열을 기준으로 정렬합니다. 간단한 예시를 볼게요.

irb(main):001:0> a=[] => [] irb(main):002:0> a.push([“b”,45]) => [[“b”, 45]] irb(main):003:0> a.push([“a”,345]) => [[“b”, 45], [“a”, 345]]

irb(main):005:0> a.push([“e”,35]) => [[“b”, 45], [“a”, 345], [“e”, 35]] irb(main):006:0> a.push([“z”,335]) => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335]] irb(main):007:0> a.push([“p”,39935]) => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335], [“p”, 39935]] irb(main):008:0> a => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335], [“p”, 39935]] irb(main):009:0> a => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335], [“p”, 39935]] irb(main):010:0> b = a.sort => [[“a”, 345], [“b”, 45], [“e”, 35], [“p”, 39935], [“z”, 335]] irb(main):011:0> b => [[“a”, 345], [“b”, 45], [“e”, 35], [“p”, 39935], [“z”, 335]]

대충 a라는 array에 값을 막 넣어줍니다. a array 안에는 문자열과 숫자값을 가진 array가 들어갑니다. 여기서 b라는 변수에 a.sort (정렬) 함수의 리턴을 넣어줍니다.

그러면.. 아래와 같이

irb(main):014:0* a => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335], [“p”, 39935]] irb(main):015:0> b => [[“a”, 345], [“b”, 45], [“e”, 35], [“p”, 39935], [“z”, 335]] irb(main):016:0>

정렬이 됩니다. 다만 그게 a안의 array의 첫번째 열 기준으로 정렬되지요. 필자는 두번째 열로 정렬해야 했습니다. 그래서 간단하게 csort라는 함수를 하나 만들었죠.


def csort(array,index)   # csort(target array , sort a column)
temp = array
i=0
while(i<temp.size)
 tempa = temp[i][0]
 temp[i][0] = temp[i][index]
 temp[i][index] = tempa
 i+=1
end
temp = temp.sort
i=0
while(i<temp.size)
 tempa = temp[i][0]
 temp[i][0] = temp[i][index]
 temp[i][index] = tempa
 i+=1
end

return temp
end

원리는 간단합니다. 지정한 index랑 index0(첫번째 열)과 바꿔치기 후 정렬, 그다음 값에 대해 다시 원복하는식으로 돌아갑니다.

테스트를 해보면..

irb(main):033:0* a => [[“b”, 45], [“a”, 345], [“e”, 35], [“z”, 335], [“p”, 39935]] irb(main):034:0> b => [[“a”, 345], [“b”, 45], [“e”, 35], [“p”, 39935], [“z”, 335]] irb(main):035:0> c = csort(a,1) => [[“e”, 35], [“b”, 45], [“z”, 335], [“a”, 345], [“p”, 39935]] irb(main):036:0>

2번째 열(index1) 기준으로 잘 정렬되었네요. 아주 작은 시간만 투자하면 좀 더 편하게 코딩할 수 있습니다.