| | at : |


Archive

[RUBY] Cuntom column sort function on Two-dimensional array 하훌 rwxr-xr-x 0 8/08/2016



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

Permission rw-r--r--
Author 하훌
Date and Time 8/08/2016
Label
License 크리에이티브 커먼즈 라이선스



루비로 코딩하던 중 귀찮은 일이 있었습니다. 바로 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) 기준으로 잘 정렬되었네요.
아주 작은 시간만 투자하면 좀 더 편하게 코딩할 수 있습니다.

Share







HAHWUL
HACKING | PENETRATION-TEST | CODING
HACKERONE : GIT : 0DAY-TODAY : EXPLOIT-DB : PACKETSTORM
GOOGLE+ | HAHWUL@GMAIL.COM | TWITTER
WWW.HAHWUL.COM






Recent Post

0 개의 댓글:

댓글 쓰기