ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[Java] SortedSet์— ๋Œ€ํ•ด์„œ.

created:2013-01-14
updated:2017-04-27
edit

Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผย ์ƒ์†๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ธ SortedSet ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. Set์€ ๋ถ€๊ฐ€์ ์œผ๋กœ(์ค‘๋ณต์ œ๊ฑฐ์™ธ์—) elementย ์— ๋Œ€ํ•œ ์ „์ฒด ordering์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. elementย ๋“ค์€ย natural ordering์— ์˜ํ•ด์„œ ์ˆœ์„œ๊ฐ€ ๋งค๊ฒจ์ง€๊ฑฐ๋‚˜ ๋˜๋Š” SortedSet์˜ ์ƒ์„ฑ์‹œ ์ œ๊ณต๋œ Comparator ์— ์˜ํ•ด์„œ ์ˆœ์„œ๊ฐ€ ๋งค๊ฒจ์ง„๋‹ค.ย 

SortedSet์€ comparator ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.ย ์ด SortedSet์˜ Iterator ๋Š” ascending element order๋กœ ๋ณด์—ฌ์ค€๋‹ค.ย ๋ช‡๋ช‡ ์ถ”๊ฐ€์ ์ธ ํ•จ์ˆ˜๋“ค์€ ordering์˜ ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค.ย 

SortedSet์— ์‚ฝ์ž…๋œ ๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ,ย (ํ˜น์€ ํŠน์ • comparator๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜)๋ชจ๋“  ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ ์ƒํ˜ธ๊ฐ„์— ๋น„๊ต๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๊ฒŒ ์•ˆ๋œ๋‹ค๋ฉด, ClassCastException ์ด ๋ฐœ์ƒ๋œ๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.ย 

Exception in thread โ€œmainโ€ java.lang.ClassCastException: com.konantech.test.TestData cannot be cast to java.lang.Comparable  
     at java.util.TreeMap.put(Unknown Source)
     at java.util.TreeSet.add(Unknown Source)
     at com.konantech.test.test.main(test.java:129)

์™œ ์ด๋Ÿฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ?

๋น„๊ต๋ฅผ ํ•˜๋ ค๋ฉด Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ์—†๋‹ค๋ฉด SortedSet ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋น„๊ตํ• ์ง€๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ย ์šฐ๋ฆฌ๋Š” ๋น„๊ตํ•  ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค.ย 

๋น„๊ตํ•  ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋„๋ก ํ•˜์ž. Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚ด๊ฐ€ ๋งŒ๋“  TestData ๋ผ๋Š” ํด๋ž˜์Šค์—ย implements ํ•˜๋ ค๋ฉด compareTo ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด size()๋ฅผ ๋น„๊ตํ•˜๋Š” compareTo() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

๋‹ค์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด์ž. ๋“ค์–ด๊ฐ„ ์ˆœ์„œ๋Š” ์ œ๊ฐ๊ฐ์ด์ง€๋งŒ, iterator๋ฅผ ํ†ตํ•ด์„œ ๋‚˜์˜จ ๊ฐ’์„ ๋ณด๋ฉดย ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ascending ๋˜์–ด์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์‹ค ๊ฐœ์ธ์ ์œผ๋กœ Iterator๋ฅผ ์„ ํ˜ธํ•˜์ง€๋Š” ์•Š๋Š” ํŽธ์ด๋ผ์„œ List๋ฅผ SortedSet์ฒ˜๋Ÿผ ์“ฐ๋ ค๋ฉด List ์•ˆ์— ๊ฐ์ฒด๋ฅผ ๋„ฃ์€ ์ƒํƒœ์—์„œComparator๋กœ List์•ˆ์— ๊ฐ์ฒด์˜ ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค. ์ž˜ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ฐจ์ด์ ์€ ์ •๋ ฌ์„ ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์–ด๋Š ์‹œ์ ์— ์ •๋ ฌ์„ ํ•˜๋Š๋ƒ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋œ๋‹ค.ย 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ณผ์ •์—์„œ ์‹ค์‹œ๊ฐ„ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ ค๊ณ  ํ•œ๋‹ค๋ฉด SortedSet์„ ์“ฐ๋Š” ๊ฒƒ์ด ํŽธํ• ๊ฒƒ์ด๋ผ๊ณ ย ์ƒ๊ฐ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด List๋ฅผ ์“ฐ๋ฉด Comparator๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ณ„์† ๋‹ด๊ณ  ์žˆ๋Š” ๊ณผ์ •์—์„œ ๊ทธ๋Ÿฌ๊ธฐ์—” ๋ถ€๋‹ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.ย 

๋˜ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋‹ด๊ฒจ์ง„ ํ›„์—, List์˜ ๋“ค์–ด๊ฐ€ ๊ฐ์ฒด๋‚ด ์–ด๋–ค ๋ณ€์ˆ˜, size, age ๋“ฑ์„ ๋Œ€์ƒ์œผ๋กœ ์ž์ฃผ sorting์„ ํ•ด์„œ ๋ญ”๊ฐ€๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด List-Comparator ์กฐํ•ฉ์ดย ๋‚˜์„๊ฒƒ ๊ฐ™๋‹ค๋Š”ย ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์ด ๋ถ€๋ถ„์€ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด ์ง„๋‹ค.

compareTo() == equals() ๋ฅผ ํ•˜๋ผ.

๋ฌด์Šจ ์• ๊ธฐ๋ƒ ํ•˜๋ฉด equals() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋„ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ• ์ˆ˜ ์žˆ๊ณ , compareTo()๋ฅผ ํ†ตํ•ด์„œ๋„ ๋น„๊ตํ• ์ˆ˜ ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ SortedSet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์— ๋„ฃ์„๋•Œ๋Š” ํ•ด๋‹น ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๋น„๊ต/์ •๋ ฌ์„ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ• ์ง€๋Š” ๊ทธ ๊ตฌํ˜„ ํด๋ž˜์Šค์— ๋‹ฌ๋ ค์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, equals() ์™€ compareTo() ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„ ๋ฐ ๋™์ž‘๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ๋ช‡๋ช‡ Collection ์—์„œ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ •๋ ฌ๋˜๊ฑฐ๋‚˜ ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

SortedSet ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค์—์„œ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” 4๊ฐ€์ง€ ์ƒ์„ฑ์ž

๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์˜ SortedSet ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์€ 4๊ฐœ๊ฐ€์ง€ ํ‘œ์ค€(standard) ์ƒ์„ฑ์ž๋“ค์€ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

์ƒ์„ฑ์ž ํ˜•ํƒœ์„ค๋ช…
ย void (no arg) ์ƒ์„ฑ์ž ย ๋นˆ sortedSet ์„ ์ƒ์„ฑ.ย natural ordering์— ๋”ฐ๋ผ์„œ ์ •๋ ฌ๋œ ์—˜๋ฆฌ๋จผํŠธ
ย Comparator ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž ย ๋นˆ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ธ์ž๋กœ ๋ฐ›์€ Comparator ์ ์šฉ
ย Collection์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž ย ์ƒˆ๋กœ์šด SortedSet์„ ์ƒ์„ฑ.ย  ย Collection์„ natural ordering์„ ํ•ด์„œ SortedSet์„ ๋งŒ๋“ ๋‹ค.ย 
ย SortedSet์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž ย ์ƒˆ๋กœ์šดย ย SortedSet์„ ์ƒ์„ฑ. ย ์ธ์ž๋กœ ๋ฐ›์€ SortedSet๊ณผ ๊ฐ™์€ ordering์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.ย 
์‹ค์ œ๋กœ SortedSet์„ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” TreeSet์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.ย  ์ •ํ™•ํ•˜๊ฒŒ ์œ„์—์„œ ๊ถŒ์žฅํ•œ 4๊ฐ€์ง€ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.ย  **SortedSet ์ „์šฉํ•จ์ˆ˜๋“ค์˜ ์ด์ƒํ•œ ํ–‰๋™๋“ค.** ์˜ˆ๋ฅผ ๋“ค์–ด, subsets() ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ์ด ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ์ „์ฒด element ์—์„œ ํŠน์ • ๋ฒ”์œ„์˜ element ๋“ค์„ ๋ฝ‘์•„์„œ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.ย subset ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ๋ณด๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ element๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค. > fromElement โ€“ low endpoint (inclusive) of the returned set > toElement โ€“ high endpoint (exclusive) of the returned set fromElement๋Š” ํฌํ•จ, toElement๋Š” ์ œ์™ธ๋ผ๊ณ  ๋˜์–ด ์žˆ๋‹ค. TreeSet์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜๋‹ค. 6์„ ํฌํ•จํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ž๋ฐ” ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ์•ˆํ•˜๊ณ  ์žˆ๋‹ค.ย  6์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ ํ•œ๋‹ค๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ? 6์€ ์›๋ž˜ ์ œ์™ธ์˜€๊ณ  โ€œ\0โ€ณ์„ fromElement ์ธ์ž์— ๋ถ™์ด๊ฒŒ ๋˜๋ฉด exclusive ์„ฑ์งˆ๋กœ ๋ฐ”๋€Œ์–ด์„œ 1์ด ๋ณด์—ฌ์ง€์ง€ ์•Š๋Š”๋‹ค.ย subSet ์„ ๋ณด๋ฉด List์˜ subList() ํ•จ์ˆ˜๊ฐ€ ์ƒ๊ฐ๋‚˜๊ธฐ ๋งˆ๋ จ์ธ๋ฐ, ๋‹ค๋ฅธ ์ ์€ Set๊ณผ List์˜ ์ฐจ์ด์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๊ฐ€ ์•„๋‹Œ element ์ž์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. SortedSet์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ordering ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— subSet ์ž์ฒด๋„ ์ž…๋ ฅํ•œ ์ˆœ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ordering ๋œ ์ƒํƒœ์—์„œ subSet()์„ ํ•œ๋‹ค. ์ด์ ์„ ์ฃผ์˜ํ•˜์ž.ย ์—ฌํƒ€์˜ ๋‹ค๋ฅธ sortedSet ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด์ž.ย 
SortedSet ํ•จ์ˆ˜๋“ค ์„ค๋ช…
ย first()ย ย ๊ฐ€์žฅ ์•ž ์—˜๋ฆฌ๋จผํŠธ, ์‚ญ์ œ ์•ˆ๋จ
ย last()ย ย ๊ฐ€์žฅ ๋’ค ์—˜๋ฆฌ๋จผํŠธ, ์‚ญ์ œ ์•ˆ๋จ.
ย headSet(toElement)ย ํŠน์ • ์—˜๋ฆฌ๋จผํŠธ ๋ณด๋‹ค ์ž‘์€ ์—˜๋ฆฌ๋จผํŠธ๋“ค , ํŠน์ • ์—˜๋ฆฌ๋จผํŠธ ๋ถˆํฌํ•จ
ย tailSet(fromElement)ย ํŠน์ • ์—˜๋ฆฌ๋จผํŠธ ๋ณด๋‹ค ํฐ ์—˜๋ฆฌ๋จผํŠธ ๋“ค , ํŠน์ •์—˜๋ฆฌ๋จผํŠธ ํฌํ•จ,ย 

์˜ˆ์ œ๋กœ headSet(), tailSet()์„ ์•Œ์•„๋ณด์ž.

ํ•˜์ง€๋งŒ, +โ€\0โ€ณ๋ฅผ ํ•˜๋ฉด ์„ฑ์งˆ์ด ๋ฐ”๋€๋‹ค. inclusive <=> exclusive

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.fromElement๋Š” ํฌํ•จ,ย toElement๋Š” ๋ฌด์กฐ๊ฑด ๋ถˆํฌํ•จ์ด ๊ธฐ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  โ€œ\0โ€ณ์ด ๋ถ™๊ฒŒ ๋˜๋ฉด ์„ฑ์งˆ์ด ๋ณ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์ •๋ง ํŠน์ดํ•œ ๋ฐฉ์‹์ด ์•„๋‹์ˆ˜๊ฐ€ ์—†๋‹ค.


#collection  #dev  #SortedSet  #TreeSet  #์ž๋ฐ”