๋ณธ ๋ด์ฉ์ ํ๋น๋ฏธ๋์ด์์ ์ถ๊ฐํ ์ฑ (๊ฐ๋ฐ์ ๊ธฐ์ ๋ฉด์ ๋ ธํธ)์ ์ผ๋ถ ๋ด์ฉ์ ๋ณด๊ฐํ๊ธฐ ์ํด์ ๋ง๋ Collection Framework ๊ฐ์ด๋ ์ ๋๋ค.
์ฑ ์ ๋ถ๋์ ์ฝ๋๋ ์ด๋ก ๋ฑ์ ๋ด์ฉ์ ๋ค ๋ด์๋ด์ง ๋ชปํ์๊ธฐ์ ๋ฌธ์๋ก ์ถ๊ฐ์ ์ธ ์ค๋ช ์ ์งํํฉ๋๋ค.
์ค๋ช ์์๋ ํ์ดํ์ ์ค์ด๊ธฐ ์ํด์ ์กด๋๋ฅผ ์๋ตํ์ผ๋ ์ํด ๋ฐ๋๋๋ค.
๋ง์ฝ ๋ด์ฉ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ ์ค/ํ์๊ฐ ์์ ๊ฒฝ์ฐ [email protected]์ผ๋ก ๋ฉ์ผ ๋ถํ๋๋ฆฝ๋๋ค.
- Instagram - https://www.instagram.com/codevillains
- email - [email protected]
- Yes24 - https://www.yes24.com/Product/Goods/125554439
- KyoboBooks - https://product.kyobobook.co.kr/detail/S000212738756
- Collection Framework์ ๊ธฐ๋ณธ ๊ฐ๋
- 1. ์๋ฐ์ ์๋ฃ๊ตฌ์กฐ
- 2. Collection ์ธํฐํ์ด์ค
- 3. Collection์ ๊ธฐ๋ณธ ์์ฑ ๋ฐฉ๋ฒ
- 4. Collection ์ ์ฌ์ฉ
- 5. Map
- 6. Collection์ ํ์ฉ ์์
- 7. Collection ์ ์ด์ฉํ ๋ฐ์ดํฐ์ ์ ๋ ฌ
- Tip. ํ๊ธ, ์๋ฌธ, ์ซ์์์ผ๋ก ์ ๋ ฌ
Table of contents generated with markdown-toc
- 2024.03.25, ํ๋น๋ฏธ๋์ด, ์ด๋จํฌ(codevillain) ์
์ ์ ๋ฐ ์ฃผ๋์ด ๊ฐ๋ฐ์ง๊ตฐ์ ์ทจ์ ๋ฐ ์ด์ง์ ์ํ ๊ฐ์ด๋
์๋ฅ ์์ฑ ๋ฐฉ๋ฒ๋ถํฐ , ์ ๋งํ ํ์ฌ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ, ์ฝ๋ฉ ํ ์คํธ์ ๊ธฐ์ ๋ฉด์ ์ ์ค๋นํ๊ธฐ ์ํด ์์์ผ ํ ๊ฐ๋ ๋ค์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง ์ค๋ช ํ์ต๋๋ค.
ํนํ ๋ฉด์ ์์ ๋ฉด์ ๊ด์ด ๋์ง๋ ์ง๋ฌธ์ ์๋์ ํด๋น ์ง๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ต๋ณํ๊ธฐ ์ํ ์ค์ง์ ์ธ ๋์ฒ๋ฐฉ๋ฒ์ ๋ํด์ ๊ธฐ์ ํ์์ต๋๋ค. ์์ธ๋ฌ ๊ธฐ์ ๋ฉด์ ์ ๋์ด ์ธ์ฑ๋ฉด์ ์์ ๊ฐ์ ธ์ผํ ๋ง์๊ฐ์ง๊ณผ ๋ฆฌ๋์ญ ์์น, ์ ๋ต์ด ์๋ ์ง๋ฌธ์ ๋์ฒํ๊ธฐ ์ํ ์ฌ๋ก๋ค์ ์๊ฐํ์์ต๋๋ค.
์ทจ์ ๋ฐ ์ด์ง์ ์ํฉ์์ ๋ณธ์ธ์ด ์ค๋นํ๊ณ ์๋ ๋ฐฉํฅ์ด ๋ง๋์ง ์ ๊ฒํ๊ณ ์ปค๋ฆฌ์ด ํจ์ค๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํด์ผ ํ๋์ง ์ค์ฒ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์ ์ํจ์ผ๋ก์ ๋์์ ์ฃผ๊ณ ์ ํ์์ต๋๋ค.
- ์๋์ด๋ฉด์ ๊ด์ด ์๋ ค์ฃผ๋ ๊ฐ๋ฐ์ ์ทจ์ ๊ณผ ์ด์ง, ํ๋ฐฉ์ ํด๊ฒฐํ๊ธฐ ์ด๋ก ํธ
- ์๋์ด๋ฉด์ ๊ด์ด ์๋ ค์ฃผ๋ ๊ฐ๋ฐ์ ์ทจ์ ๊ณผ ์ด์ง, ํ๋ฐฉ์ ํด๊ฒฐํ๊ธฐ ์ค์ ํธ
Java๋ ๊ธฐ๋ณธํ์ (์ํ, Primitive ํ์ ๋๋ ์์ํ์ด๋ผ๊ณ ๋ ํ๋ค)์ ์๋ฃ ์ด์ธ์๋ String ์ด๋ ๋ฐฐ์ด(์ฐธ์กฐํ ํ์ , Reference Type)์ด ์กด์ฌํ๋ค. ์ฐธ์กฐํ ํ์ ์ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ค. ์๋ฅผ ๋ค์ด, String์ ์๋ฐ์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ํด๋์ค๋ก ๋ฌธ์์ด์ ํํํ๊ณ ๋ค๋ฃจ๊ณ , ๋ฐฐ์ด๋ ์ฐธ์กฐํ ํ์ ์ ์ํ๋ฉฐ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ค. ์ด๋ฌํ ์ฐธ์กฐํ ํ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋๊ณ , ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค. ์ด ๋ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ Collection ํ์ ๋ ์กด์ฌํ๋ค.
์ฝ๋ ์ ํ๋ ์์ํฌ๋ java.util ํจํค์ง ์์ ์์นํ๋ฉฐ, ์ฌ๋ฌ ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ก ๊ตฌ์ฑ ๋์ด์๋ค. ์ฃผ์ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค:
- List: ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ ๋ค๋ฃจ๋ฉฐ, ๋ฐ์ดํฐ ์ค๋ณต์ ํ์ฉ. ArrayList, LinkedList ๋ฑ์ด ์๋ค.
- Set: ์์๋ฅผ ์ ์งํ์ง ์๊ณ , ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๋ฐ์ดํฐ ์งํฉ. HashSet, LinkedHashSet, TreeSet ๋ฑ์ด ์๋ค.
- Queue: FIFO(First In First Out) ๋ฐฉ์ ๋๋ ์ฐ์ ์์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ธํฐํ์ด์ค. LinkedList, PriorityQueue๋ฑ์ด ์ด์ ์ํ๋ค.
- Map: ํค(Key)์ ๊ฐ(Value)์ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ. ํค๋ ์ค๋ณต๋ ์ ์์ผ๋ฉฐ, ๊ฐ ํค๋ ํ๋์ ๊ฐ๋ง์ ๊ฐ๋ฆฌํจ๋ค. HashMap, TreeMap, LinkedHashMap ๋ฑ์ด ์๋ค.
์ฝ๋ ์ ํ๋ ์์ํฌ์ ๋ํด์๋ ๋ณธ ๋ฌธ์์์ ์ค์ ์ ์ผ๋ก ์ค๋ช ํ๋ค.
์ค๋ช ์ ์์ ๋ฐฐ์ด์ ๋จผ์ ์ดํด๋ณด์.
๊ธฐ๋ณธ์ ์ผ๋ก int ํ์ ์ด๋ String ํ์ ์ ์๋ฃ๋ค์ ์ฌ๋ฌ๊ฑด ๋ด๊ธฐ ์ํด์๋ ๋ฐฐ์ด์ ์ ์ธํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ค.
์๋์ ์ํ์ฝ๋๋ฅผ ์ดํด๋ณด์
int[] ids;
int[] ids = new int[5];
String[] userInfoArray = new String[10];
String[] userInfoArray = new String[] {"one", "two"};
์์ ๊ตฌ๋ฌธ์ ๋ฐฐ์ด์ ์ ์ธ๋ถ์ด๋ค.
๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ int arrayLength = userInfoArray.length; ์ ๊ฐ์ด ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐฐ์ด์ ์์์ ๋ํด์๋ ๋ฐ๋ณต ์ ๊ทผ์ ํตํด ํ์ธ ํ ์ ์๋ค.
for (int I = 0; I < userInfoArray.length; i++) {
String s = userInfoArray[i];
}
๋, System.arraycopy(src, srcPos, dest, destPos, length)์ ๊ฐ์ ๋ฉ์๋๋ฅผ ํตํด ๋ฐฐ์ด์ ๋ณต์ฌ ํ ์ ์์ผ๋ฉฐ, java.util.Arrays.sort ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌ์ ์ํํ ์ ๋ ์๋ค.
๋ฐฐ์ด์ ์ฐ๋ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ๊ณผ ์ฌ์ฉ์ด ๋งค์ฐ ํจ์จ์ (ํน์ ์์์ ๋ํ ์ ๊ทผ์ด ๋งค์ฐ ๋น ๋ฆ)
- Type-safe : ๋ฐฐ์ด์ ์ ์ธ๋ ๋ฐ์ดํฐ ํ์ ๋ง ์ถ๊ฐ๋ ์ ์์
- ๊ตฌํ์ด ๊ฐ๋จํจ
๋ฐ๋ฉด, ๋จ์ ์ ์๋์ ๊ฐ๋ค.
- ๊ณ ์ ํฌ๊ธฐ, ๋ณต์ฌ์ ํฌ๊ธฐ ์ฌ์กฐ์ ์ ์ค๋ฒํค๋ ์กด์ฌ
- ๋ฐฐ์ด์์ ๋ช ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ์ผ์ผ์ด ๊ฒ์ฌํด์ผํจ
- ์ฝ๋ ์ ์ ๋นํด ์ ํ๋ ๊ธฐ๋ฅ, ์ข ๋ ๋ฒ์ฉ์ ์ธ ๊ธฐ๋ฅ์ด ํ์ํจ
์ด ๊ฐ์ ์ด์ ๋๋ฌธ์ ์ข ๋ ๋ค์ด๋ด๋ฏนํ ๋ฐ์ดํฐ ํ์ ์ธ Collection์ ์ ํํ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ์์๋ณด๊ณ ์ ํ๋ค.
Collection์ ๊ฐ์ฒด๋ค์ ๋ชจ์๋ ์๋ฃ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๊ฐ๋ ์ด๋ค.
๋ชจ๋ Collection์ ์์ ์ธํฐํ์ด์ค๋ก์จ Collection๋ค์ด ๊ฐ๊ณ ์๋ ํต์ฌ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค.
List ์ Set ์ธํฐํ์ด์ค๊ฐ ๋ชจ๋ Collection ์ธํฐํ์ด์ค๋ฅผ ์์ํ๊ณ ์์ผ๋ฏ๋ก ํต์ฌ์ ์ธ ์๋ฃ๊ตฌ์กฐ์์์ ์ฐ์ฐ์ด Collection ์ธํฐํ์ด์ค์ ์ ์ ๋์ด ์์์ ์์ ์๋ค
Collection ๋์ ๋ฐฉ์์ ์ดํดํ๋ ค๋ฉด Collection ์ธํฐํ์ด์ค๊ฐ ์ ์ํ๋ ๋ฉ์๋๋ค์ ์ดํด๋ณด๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๊ฒ์ด๋ค. ์ด ์ธํฐํ์ด์ค๋ java.util ํจํค์ง์ ์์นํด ์์ผ๋ฉฐ, ์ปฌ๋ ์ ์ ๋ค๋ฃจ๊ธฐ ์ํ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๋ฉ์๋๋ฅผ ํฌํจํ๊ณ ์๋ค.
- boolean add(E e): ์ง์ ๋ ์์๋ฅผ ์ปฌ๋ ์ ์ ์ถ๊ฐํ๋ค.
- boolean remove(Object o): ์ง์ ๋ ์์๋ฅผ ์ปฌ๋ ์ ์์ ์ ๊ฑฐํ๋ค.
- boolean contains(Object o): ์ง์ ๋ ์์๊ฐ ์ปฌ๋ ์ ์ ํฌํจ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค.
- int size(): ์ปฌ๋ ์ ๋ด์ ์์ ์๋ฅผ ๋ฐํํ๋ค.
- boolean isEmpty(): ์ปฌ๋ ์ ์ด ๋น์ด ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ค.
- Iterator iterator(): ์ปฌ๋ ์ ์ ์์๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐ ์ฌ์ฉํ ๋ฐ๋ณต์๋ฅผ ๋ฐํํ๋ค.
- void clear() : ์ปฌ๋์ ์ ๋น์ด๋ค.
Collection ํ์๋ก Set ๊ณ์ด(TreeSet
, SortedSet
, LinkedHashSet
, HashSet
)๊ณผ List ๊ณ์ด(ArrayList
, LinkedList
, Vector
)๋ฑ์ด ์์ผ๋ฉฐ ์ด์๋ ๋ณ๋๋ก Map ๊ณ์ด(SortedMap
, TreeMap
, HashMap
, Hashtable
)์ด ์กด์ฌํ๋ค.
Map์ Collection์ ํ์ฅํ์ง ์์์ง๋ง Collection์ ํ ๋ถ๋ถ์ผ๋ก ๋ถ๋ฅํ์ฌ ์ฌ์ฉํ๋ค.
์ด ์ธ์๋ Queue์ Deque๊ฐ ์๋ค.(ํ์ ๋ฑ์ ์ฐจ์ด๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ํด์๋ ์ฑ ์ ๋ ์์ธํ ์ค๋ช ๋์ด์๋ค.)
์๋์ ์ด๋ฏธ์ง๋ฅผ ํตํด Collection ์ธํฐํ์ด์ค์ ์ ๋ฐ์ ์ธ ์์๊ณผ ๊ตฌํ์ ๋ํด์ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค. ์ฃผ์ ๊ตฌํ ํด๋์ค๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
ArrayList: ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ ๋ฐฐ์ด๋ก ๊ตฌํ๋ ๋ฆฌ์คํธ.
LinkedList: ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ ๋ฆฌ์คํธ ๋ฐ ํ.
HashSet: ํด์ ํ ์ด๋ธ์ ์ํด ๊ตฌํ๋ ์งํฉ.
LinkedHashSet: ์์๋ฅผ ์ ์งํ๋ ํด์ ํ ์ด๋ธ์ ์ํด ๊ตฌํ๋ ์งํฉ.
TreeSet: ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ์ํด ๊ตฌํ๋ ์ ๋ ฌ๋ ์งํฉ.
PriorityQueue: ์ฐ์ ์์ ํ์ ์ํด ๊ตฌํ๋ ํ.
ArrayDeque: ๋ฐฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฑ.
Collection ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ ์๋ฃํ์ผ๋ก ์์๋ค์ ์์๋ฅผ ์ ์ฅํ์ฌ ์์ธ(Index)์ ์ฌ์ฉํ์ฌ ํน์ ์์น์ ์์๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ ๊ทผํ ์ ์๋ค. ์ค๋ณต์ ํ์ฉํ๊ณ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ค. ๊ฐ๋ณํ ๋ฐฐ์ด๊ณผ ๋น์ทํ๋ค.
์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์ ์ ์ง: ์์๊ฐ ์ฝ์ ๋ ์์๋ฅผ ์ ์งํ๋ค.
์ธ๋ฑ์ค ๊ธฐ๋ฐ ์ ๊ทผ: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์์น์ ์์์ ์ ๊ทผํ ์ ์๋ค.
์ค๋ณต ํ์ฉ: ๋์ผํ ์์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ์ฅํ ์ ์๋ค.
- List๋ก ์ฌ์ฉํ ์ ์๋ ํด๋์ค : ArrayList, LinkedList , Vector ๋ฑ์ด ์กด์ฌํ๋ค.
- ArrayList
- ๋ด๋ถ์ ์ผ๋ก ๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- ์๋นํ ๋น ๋ฅด๊ณ ํฌ๊ธฐ๋ฅผ ๋ง์๋๋ก ์กฐ์ ํ ์ ์๋ ๋ฐฐ์ด
- ์์์ ์ ๊ทผ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, ๋๋ค ์์ธ์ค๊ฐ ํจ์จ์ ์ด๋ค.
- ๋จ๋ฐฉํฅ ํฌ์ธํฐ ๊ตฌ์กฐ๋ก ์๋ฃ์ ๋ํ ์์ฐจ์ ์ธ ์ ๊ทผ์ ๊ฐ์ ์ด ์์
- ์์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ์๋์ ์ผ๋ก ๋๋ฆด ์ ์๋ค.
- ๋ด๋ถ์ ์ผ๋ก ๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
- Vector
- ArrayList์ ๊ตฌํ ๋ฒ์ . ๋ชจ๋ ๋ฉ์๋๊ฐ ๋๊ธฐํ๋์ด ์์(thread safe)
- ๋๋ ค์ ์ ์ฐ์ด์ง ์์
- LinkedList
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ
- ์๋ฐฉํฅ ํฌ์ธํฐ ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ์ ์ฝ์
, ์ญ์ ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ฅ.
- ์์์ ์ ๊ทผ ์๋๋ ์๋์ ์ผ๋ก ๋๋ฆผ
- ์คํ, ํ, ์๋ฐฉํฅ ํ ๋ฑ์ ๋ง๋ค๊ธฐ ์ํ ์ฉ๋๋ก ์ฐ์
- CopyOnWriteArrayList
- ์ฐ๊ธฐ ์ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ์ฌ ์ค๋ ๋์ ์์ ํ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํ
- ์ฝ๊ธฐ ์์ ์ ๋งค์ฐ ๋น ๋ฅด์ง๋ง, ์ฐ๊ธฐ ์์ ์ ์๋์ ์ผ๋ก ๋๋ฆผ.
๋ค์์ ํ์ฉ ์ฝ๋๋ฅผ ์ดํด๋ณด์. (src ํ์์ java/main์์ ๊ฐ ์ธํฐํ์ด์ค๋ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์์ ๋ค์ ํ์ธํ ์ ์๋ค. com.codevillains.collection.method ํจํค์ง ์ฐธ์กฐ )
/**
* @author CodeVillains
* @description : ArrayList ์ ์ฒด ๋ฉ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด๋ณธ๋ค.
*/
package com.codevillains.collection.method;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ArrayListMethodExample {
public static void main(String[] args) {
// List ์ธํฐํ์ด์ค๋ฅผ ArrayList ๊ตฌํ ํด๋์ค๋ก ์ฌ์ฉ
List<String> list = new ArrayList<>();
// ์์ ์ถ๊ฐ
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println("์ต์ด list: " + list);
// ์์ ์ฝ์
list.add(1, "Orange");
System.out.println("์์ ์ฝ์
์ธ๋ฑ์ค 1, 'Orange' : " + list);
// ์ปฌ๋ ์
์ถ๊ฐ
List<String> additionalFruits = new ArrayList<>();
additionalFruits.add("Grape");
additionalFruits.add("Watermelon");
list.addAll(additionalFruits);
System.out.println("collection ์ถ๊ฐ : " + list);
System.out.println("2๋ฒ์งธ ์์ ๊ฐ์ ธ์ค๊ธฐ : " + list.get(2));
// ์์ ์์
list.set(2, "Grapes");
System.out.println("2๋ฒ์งธ ์์ ๋ณ๊ฒฝ : " + list);
// ์์ ์ญ์ (์ธ๋ฑ์ค๋ก)
String removedElement = list.remove(3);
System.out.println("3๋ฒ์งธ ์์ ์ญ์ : " + removedElement);
System.out.println("3๋ฒ์งธ ์์ ์ญ์ ํ collection: " + list);
// ์์ ์ญ์ (๊ฐ์ฒด๋ก)
boolean isRemoved = list.remove("Banana");
System.out.println("๋ฐ๋๋ ์ญ์ ์ฌ๋ถ: " + isRemoved);
System.out.println("๋ฐ๋๋ ์ญ์ ํ collection: " + list);
// ๋ฆฌ์คํธ ํฌ๊ธฐ
System.out.println("List ์ฌ์ด์ฆ: " + list.size());
// ๋ฆฌ์คํธ ๋น์ด ์๋์ง ํ์ธ
System.out.println("๋ฆฌ์คํธ๊ฐ ๋น์ด์๋์ง ํ์ธ? " + list.isEmpty());
// ์์ ํฌํจ ์ฌ๋ถ ํ์ธ
boolean containsApple = list.contains("Apple");
System.out.println("์ฌ๊ณผ๊ณผ ํฌํจ๋์ด ์๋? " + containsApple);
// ๋ฆฌ์คํธ ๋ฐ๋ณต
System.out.println("list iterating :");
for (String fruit : list) {
System.out.println(fruit);
}
// ๋ฆฌ์คํธ ๋ฐ๋ณต์ ์ฌ์ฉ
ListIterator<String> listIterator = list.listIterator();
System.out.println("list ๋ฐ๋ณต์ ์ฌ์ฉ :");
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// ํ์ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐ
List<String> subList = list.subList(1, 3);
System.out.println("SubList index 1๋ถํฐ 3๊น์ง: " + subList);
// ๋ฆฌ์คํธ ์ด๊ธฐํ
list.clear();
System.out.println("list ์ด๊ธฐํ: " + list);
System.out.println("๋ฆฌ์คํธ๊ฐ ๋น์ด์๋? " + list.isEmpty());
}
}
๊ฐ ๋ฉ์๋์ ๋ํด์ ์ดํดํ๋ ๊ฒ์ ์ด๋ ต์ง ์์ ๊ฒ์ด๋ค.
์งํฉ์ ์ ์ํ๋ฉฐ ์์์ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค. ์ค์ค๋ก ์ ์ํ ๋ฉ์๋๋ ์๋ค. (์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉ)
- Set ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํด๋์ค : HashSet, LinkedHashSet, TreeSet๋ฑ์ด ์กด์ฌ.
- HashSet
- ๊ฐ์ฅ ๋น ๋ฅธ ์์ ์ ๊ทผ ์๋
- ์์๋ฅผ ์ ํ ์์ธกํ ์ ์์
- LinkedHashSet
- ์ถ๊ฐ๋ ์์, ๋๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ ๊ทผํ ์์๋๋ก ์ ๊ทผ ๊ฐ๋ฅ
- TreeSet
- ์ ๋ ฌ๋ ์์๋๋ก ๋ณด๊ด. ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ง์ ํ ์ ์์
Java 1.5 Generic ๋ฐฉ์์ด ๋์จ ํ ๋ก ์๋์ ๊ฐ์ด Collection์ ์์ฑํ ์ ์๊ฒ ๋์๋ค.
List<String> list= new ArrayList<String>();
List <String> userList= new ArrayList <String> (5);
Map<String, Object> userMap= new HashMap<String, Object> ();
Set<String> userSet= new HashSet<String> ();
์ ๋ฐฉ์์ Java 1.5 ๋ฒ์ ์ด ๋์ค๊ณ Generic ๊ฐ ์ถ๊ฐ ๋ ์ดํ ์ฝ๋๋ผ์ ์์๋ก์จ ์์ฑํ์ง๋ง ํ์ฌ์ ์ฝ๋ ์ค์ ์๋ฃจ์
์ java.util.Collections
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ธ ๋น Collection ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ฉด ์๋์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌํดํด์ค ์ ์๋ค.
List<User> list = Collections.EMPTY_LIST; // ๋น๊ถ์ฅ
Map<String, Object> maps = Collections.EMPTY_MAP; // ๋น๊ถ์ฅ
Set<String> sets = Collections.EMPTY_SET; // ๋น๊ถ์ฅ
// 1.5 Generic์ผ๋ก ์ธํ List<T> ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํ์
์์ ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
List<User> collection1 = Collections.emptyList();
Map<String, String> collection2 = Collections.emptyMap();
Set<String> collection3 = Collections.emptySet();
List list = Collections.EMPTY_LIST์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ฒดํฌ๋ฅผ ํ์ง ์์ ํ์ ๋ถ์ผ์น ๋ฌธ์ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ ์ฌ์ง๊ฐ ์์ด์ Collections.emptyList()๋ฅผ ๋ฐํํ๋ ๊ฒ์ผ๋ก ๊ถ์ฅํ๋ค. Collections.emptyList() ๋ ๋ถ๋ณ๊ฐ์ฒด๋ก์จ ๊ฐ์ ์ถ๊ฐ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Collections.EMPTY_LIST
, Collections.EMPTY_MAP
, Collections.EMPTY_SET
๋ ์ ๋ค๋ฆญ ํ์
์ด ์ง์ ๋์ง ์์ ๋น์ ๋ค๋ฆญ ์ปฌ๋ ์
์ ๋ฐํํ๋ค.
์ด๋ ํ์
์์ ์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ, ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
์๋ฅผ ๋ค์ด, List<User>
๋์ List
๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ํ์
์บ์คํ
์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋์ Collections.java ๊ตฌํ ๋ด์ฉ์ ๋ณด๋ฉด ๊ธ๋ฐฉ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
...
public static final List EMPTY_LIST = new EmptyList<>();
Collections.emptyList() ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ List ํ์ ์ผ๋ก๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
Collection ์ธํฐํ์ด์ค๋ java.lang ํจํค์ง์ Iterable๋ฅผ extends ํ๊ณ ์๋ root ์ธํฐํ์ด์ค๋ก, List, Set, Queue์ Map ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ์๋ฃํ์ ์ ๊ณตํ๊ณ ์๋ค.
๋ช๊ฐ์ง ์ฃผ์ ์ธํฐํ์ด์ค์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ฉด,
- List ์ธํฐํ์ด์ค: List ์ธํฐํ์ด์ค๋ ์์๊ฐ ์๋ ์์์ ์งํฉ์ ๋ํ๋ด๋ฉฐ, ์ค๋ณต ์์๊ฐ ํ์ฉ๋๋ค. List ์ธํฐํ์ด์ค๋ Collection ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๊ณ ๊ตฌํํด๋์ค๋ก๋ ArrayList, LinkedList, Vector ๋ฑ์ด ์๋ค.
- Set ์ธํฐํ์ด์ค: Set ์ธํฐํ์ด์ค๋ ์ค๋ณต๋์ง ์๋ ์์์ ์งํฉ์ ๋ํ๋ด๋ฉฐ, ์์๋ ์ ์ง๋์ง ์๋๋ค. Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ก๋ HashSet, TreeSet ๋ฑ์ด ์๋ค.
- Queue ์ธํฐํ์ด์ค: Queue ์ธํฐํ์ด์ค๋ ์์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋ฐ์ํ๋ ์ ์ ์ ์ถ(FIFO) ๊ตฌ์กฐ์ ์ปฌ๋ ์ ์ ๋ํ๋ธ๋ค. Queue ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ก๋ PriorityQueue, ArrayDeque ๋ฑ์ด ์๋ค.
- Map ์ธํฐํ์ด์ค: Map ์ธํฐํ์ด์ค๋ ํค-๊ฐ(key-value) ์์ผ๋ก ์ด๋ฃจ์ด์ง ์์์ ์งํฉ์ ๋ํ๋ธ๋ค. Map ์ธํฐํ์ด์ค๋ Collection ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ์ฅํ์ง๋ ์์ง๋ง, Collection ์ธํฐํ์ด์ค์ ๋ง์ ๊ณตํต ๋ฉ์๋๋ฅผ ๊ณต์ ํ๋ค. Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ก๋ HashMap, TreeMap ๋ฑ์ด ์๋ค.
์๋๋ ๊ฐ ์ธํฐํ์ด์ค๋ค์ ํ์ฅํ ์๋ฃํ๋ค์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํ ์์ ์ด๋ค.
ArrayList ํด๋์ค๋ AbstractList๋ฅผ ํ์ฅํ๊ณ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ํ์์ ๋ฐ๋ผ ๊ธธ์ด๊ฐ ๋์ด๋๋ ๋์ ๋ฐฐ์ด์ ์ง์ํ๋ค. (์ฆ๊ฐ ๊ฐ์ ๊ฐ๋ฅ) ArrayList์ ์์ฑ๊ณผ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํด์ ์์ ๋ฅผ ์ดํด๋ณด๋๋ก ํ์.
/**
* @author CodeVillains
* @description : ArrayList ๊ฐ๋จ ํ์ฉ ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.ArrayList;
import java.util.List;
class ArrayListDemo {
public static void main(String args[]) {
// ๋ฐฐ์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค.
List<String> al = new ArrayList<>();
System.out.println("Initial size of al: " + al.size());
// ๋ฐฐ์ด ๋ฆฌ์คํธ์ ์์๋ค์ ์ถ๊ฐํ๋ค.
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
al.add(1, "A2"); // index 1์ A2 ๊ฐ์ ์ถ๊ฐํจ
System.out.println("Size of al after additions: " + al.size());
// ๋ฐฐ์ด ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
System.out.println("Contents of al: " + al);
// ๋ฐฐ์ด ๋ฆฌ์คํธ์์ ์์๋ค์ ์ญ์ ํ๋ค.
al.remove("F");
al.remove(2);
System.out.println("Size of al after deletions: " + al.size());
System.out.println("Contents of al: " + al);
}
}
์์ ์ฝ๋ 10๋ผ์ธ์์ String ํ์ ์ ArrayList๋ฅผ ์์ฑํ๋ค. List๋ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด๋ฅผ ํตํด ์์ฑ์ ํ์๊ณ ์ด๊ธฐ ๊ฐ์ ๋น์ฐ์ด ์์ผ๋ฏ๋ก size ๋ฅผ ๋ฐํํ๋ฉด 0์ด ๋ฆฌํด๋ ๊ฒ์ด๋ค.
20๋ผ์ธ์์ ์ ์ด์ ์ถ๊ฐํ ์์ ์ธ๋ฑ์ค 1(์ธ๋ฑ์ค๋ 0๋ถํฐ ์์)์ A2 ๋ผ๋ ๊ฐ์ ์ถ๊ฐ ํด์ฃผ์๊ณ ์ถ๋ ฅํด๋ณด๋ฉด ์ธ๋ฑ์ค 1 ์ดํ์ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ๋ฐ๋ฆฐ๊ฒ์ ํ์ธํ ์ ์๋ค.(์ฝ์ )
์์๋ฅผ remove ํ๊ธฐ ์ํด์๋ ๊ฐ์ ์ ๋ ฅํ๊ฑฐ๋ ์ธ๋ฑ์ค๋ฅผ ํตํด์ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]
๋ง์ฝ, ์๋ชป๋ ์์์ ์ ๊ทผํ ๊ฒฝ์ฐ (์ด๋ฏธ ์ง์ด ๊ฐ์ ๋ ์ง์ฐ๋ ค ํ๋ค๊ฑฐ๋, ์ฝ์ ๋์ง ์์ ๊ฐ์ ์ฐพ๋๋ค๊ฑฐ๋...) java.lang.IndexOutOfBoundsException ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
ArrayList๋ ๊ฐ๋จํ๊ฒ toArray()๋ฅผ ํตํ์ฌ ๋ฐฐ์ด๋ก ๋ณํํ ์ ์๋ค.
์๋์ ์์ ๋ฅผ ์ดํด๋ณด์.
/**
* @author CodeVillains
* @description : ArrayList to Array
*/
package com.codevillains.collection;
import java.util.ArrayList;
import java.util.List;
class ArrayListToArray {
public static void main(String args[]) {
// ๋ฐฐ์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ ๋ค.
List<Integer> al = new ArrayList<>();
// ๋ฐฐ์ด ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
al.add(new Integer(1));
al.add(new Integer(2));
al.add(new Integer(3));
al.add(new Integer(4));
System.out.println("Contents of al: " + al);
// ๋ฐฐ์ด์ ์ป๋๋ค.
Object ia[] = al.toArray();
int sum=0;
// ๋ฐฐ์ด ์์๋ค์ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ค.
for(int i=0; i<ia.length; i++){
sum += ((Integer) ia[i]).intValue();
}
System.out.println("Sum is: " + sum);
}
}
18 ๋ผ์ธ์์ ArrayList ์ toArray๋ฅผ ํตํด ๋ฐฐ์ด๋ก ๋ฐํํจ์ ํ์ธ ํ ์ ์๋ค.
๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
Contents of al: [1, 2, 3, 4]
Sum is: 10
ArrayList ์ ์ฃผ์ ๋ฉ์๋๋ ์๋์ ๊ฐ์ต๋๋ค. ๊ต์ฅํ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋์ด๋ฏ๋ก ๊ผญ ๊ธฐ์ตํด์ผ ํ๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
add(Object elem) | ArrayList์ ์์๋ฅผ ์ถ๊ฐ |
remove(int index) | index ์ ์์นํ๋ ์์ ์ ๊ฑฐ |
remove(Object elem) | elem๊ณผ ์ผ์นํ๋ ์์ ์ ๊ฑฐ |
contains(Object elem) | elem์ ํฌํจํ๊ณ ์์ผ๋ฉด true ์๋๋ฉด false |
isEmpty() | ArrayList ๊ฐ ๋น์ด์์ผ๋ฉด true ๋น์ด์์ง ์์ผ๋ฉด false |
indexOf(Object elem) | elem๊ณผ ์ผ์นํ๋ ์์์ index๋ฅผ ๋ฆฌํด, ์์ผ๋ฉด -1 |
size() | ArrayList์ ์์์ ๊ฐ์๋ฅผ ๋ฆฌํด |
get(int index) | index์ ์์นํ ์์๋ฅผ ๋ฆฌํด |
clear() | ArrayList๋ฅผ ๋น์(๋ชจ๋ ์์๋ฅผ ์ญ์ ) |
์ด ํด๋์ค๋ AbstractSequentialList๋ฅผ ํ์ฅํ๊ณ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
์ฐ๊ฒฐ-๋ฆฌ์คํธ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ณ ๋ฆฌ์คํธ์ ์ฒ์๊ณผ ๋ง์ง๋ง์ ์์๋ฅผ ์ฝ์ , ์ญ์ ํ ์ ์๋ ๊ด๋ จ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
/**
* @author CodeVillains
* @description : LinkedList
*/
package com.codevillains.collection;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String args[]) {
// ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑ.
LinkedList<String> ll = new LinkedList<String>();
// ๋งํฌ๋ ๋ฆฌ์คํธ์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
ll.add("F");
ll.add("B");
ll.add("D");
ll.add("E");
ll.add("C");
ll.addLast("Z");
ll.addFirst("A");
ll.add(1, "A2");
System.out.println("Original contents of ll: " + ll);
// ๋งํฌ๋ ๋ฆฌ์คํธ์์ ์์๋ฅผ ์ญ์ ํ๋ค.
ll.remove("F");
ll.remove(2);
System.out.println("Contents of ll after deletion: " + ll);
// ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ์์๋ฅผ ์ญ์ ํ๋ค.
ll.removeFirst();
ll.removeLast();
System.out.println("ll after deleting first and last: " + ll);
// ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ๊ฐ์ ์ค์ ํ๋ค.
Object val = ll.get(2);
ll.set(2, (String) val + " Changed");
System.out.println("ll after change: " + ll);
}
}
์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
Original contents of ll: [A, A2, F, B, D, E, C, Z]
Contents of ll after deletion: [A, A2, D, E, C, Z]
ll after deleting first and last: [A2, D, E, C]
ll after change: [A2, D, E Changed, C]
์ค์ LinkedList๊ฐ implements ๋ฐ์ Interface๋ List, Deque, Cloneable ์ ๋ ์ธ๋ฐ, List์ ์ฃผ์ ๋ฉ์๋๋ค์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ ์ถ๊ฐ ์ญ์ ๋ฑ์ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋์ฌ๊ฒจ ๋ณผ๋งํ ์ฃผ์ ๋ฉ์๋๋ addFirst, addList, getFirst, getLast, removeFirst, removeLast ๋ฑ ์ด๋ค.
๋๋คํ๊ฒ ํน์ ํ ์ธ๋ฑ์ค๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ ํน์ ์ญ์ ํ ๊ฒฝ์ฐ ArrayList๊ฐ ์ฑ๋ฅ์์ผ๋ก ์ข ๋ ์ข๊ณ , LinkedList๋ ๋ฆฌ์คํธ์ ์ฒ์๊ณผ ๋์ ์์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ฝ์ ํ๊ธฐ์ ๋ ํฐ ์์ ์ด ์๋ค
Set ์ธํฐํ์ด์ค ์์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ ์, Collection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ค์ ๋ํด์ ๊ฐ๋จํ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ณด์.
Collection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค
- AbstractCollection : Collection ์ธํฐํ์ด์ค์ ๋๋ถ๋ถ์ ๊ตฌํํ๋ค.
- AbstractList : AbstractCollection์ ํ์ฅํ๊ณ List ์ธํฐํ์ด์ค์ ๋๋ถ๋ถ์ ๊ตฌํํ๋ค.
- AbstractSequentialList : ์์๋ค์ ๋ฌด์์ ์ ๊ทผ๋ณด๋ค๋ ์์ฐจ์ ์ธ ์ ๊ทผ์ ์ฌ์ฉํ๋ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์ AbstractList๋ฅผ ํ์ฅํ๋ค.
- LinkedList : AbstractSequentialList๋ฅผ ํ์ฅํจ์ผ๋ก์จ ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํ ํ๋ค.
- ArrayList : AbstractList๋ฅผ ํ์ฅํจ์ผ๋ก์จ ๋์ ๋ฐฐ์ด์ ๊ตฌํํ๋ค.
- AbstractSet : AbstractCollection์ ํ์ฅํ๊ณ Set ์ธํฐํ์ด์ค์ ๋๋ถ๋ถ์ ๊ตฌํํ๋ค.
- HashSet : ํด์ ํ ์ด๋ธ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด์ AbstractSet์ ํ์ฅํ๋ค.
- LinkedHashSet : ์ฝ์ ์์๊ฐ ์๋ ๋ฐ๋ณต์ ํ์ฉํ๊ธฐ ์ํด HashSet์ ํ์ฅํ๋ค.
- TreeSet : ํธ๋ฆฌ์ ์ ์ฅ๋ ์งํฉ์ ๊ตฌํํ๋ค. AbstractSet์ ํ์ฅํ๋ค.
HashSet ํด๋์ค๋ AbstractSet์ ํ์ฅํ๊ณ Set ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
HashSet์ ๊ธฐ์ต์ฅ์๋ก ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ์ปฌ๋ ์ ์ ๋ง๋ค๊ณ , ํด์ ํ ์ด๋ธ์ ํด์ฑ(hashing)์ด๋ผ ๋ถ๋ฆฌ๋ ๊ธฐ์ ์ ์ฌ์ฉํด์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ , ํด์ฑ์ ํ๋ ๊ณผ์ ์ด ๋ณดํต์ ์ ๋ ฌ๋ ์งํฉ์ ์์ฑํ๋๋ฐ ์๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์์๋ค์ ์์๋ฅผ ๋ณด์ฅํด์ฃผ์ง ์๋๋ค.
์๋๋ ๊ฐ๋จํ ์์ ์ด๋ค.
/**
* @author CodeVillains
* @description : HashSet ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String args[]) {
// ํด์ ์งํฉ์ ์์ฑํ๋ค.
Set<String> hs = new HashSet<>();
// ํด์ ์งํฉ์ ์์๋ฅผ ์ถ๊ฐํ๋ค.
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println(hs);
}
}
๋ณดํต์ ๊ฒฝ์ฐ ์์๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌด์์๋ก ๋์ฌ ๊ฒ์ ๊ธฐ๋ํ์ง๋ง ์ฌ์ฉํ๋ ์๋ฐ ํ๋ซํผ์ ๋ฐ๋ผ์ ๋ด๋ถ ๊ตฌํ์ ์ํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒฝ์ฐ๋ ๋ฐ์ํ ์ ์์ผ๋ ์ด๋ Java ๋ HashSet์ ํด๋์ค ๋ช ์ธ์ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋ค. ๋ง์ฝ ์์์ ์์๊ฐ ๋ณด์ฅ๋๋ ๊ฒ์ด ์ค์ํ๋ค๋ฉด LinkedHashSet ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
LinkedHashSet ํด๋์ค๋ ๋ด๋ถ ๊ตฌํ์ด ํด์ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ฒฐํฉํ ๊ฒ์ผ๋ก, ์์๋ค์ด ์ถ๊ฐ๋ ์์๋ฅผ ์ ์งํ๋ค. ๋ฐ๋ผ์ LinkedHashSet ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์์๋ค์ด ์ถ๊ฐ๋ ์์๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.
HashSet์ ํ์ฅํ์ง๋ง ์์ ์ ๋ฉ์๋๋ ์ถ๊ฐ๋์ง ์๋๋ค. ์์ ์ค๋ช ํ๋ฐ๋ก HashSet๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฝ์ ๋ ์์๋๋ก ๋ฐ๋ณต ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.
/**
* @author CodeVillains
* @description : LinkedHashSet
*/
package com.codevillains.collection;
import java.util.LinkedHashSet;
import java.util.Set;
class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> linkHashSet = new LinkedHashSet<String>();
linkHashSet.add("B");
linkHashSet.add("A");
linkHashSet.add("D");
linkHashSet.add("E");
linkHashSet.add("C");
linkHashSet.add("F");
System.out.println(linkHashSet);
}
}
์ฒ๋ฆฌ๊ฒฐ๊ณผ
[B, A, D, E, C, F]
ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ Set ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์ ๊ณตํ๋ค.
์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ก ์ ์ฅ๋๋ฉฐ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ํจ๊ณผ์ ์ด๊ณ ๊ฒ์์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค๋ ์ฅ์ ์ด ์๋ค.
/**
* @author CodeVillains
* @description : TreeSet ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// ํธ๋ฆฌ ์งํฉ์ ๋ง๋ ๋ค.
Set<String> ts = new TreeSet<String>();
// ํธ๋ฆฌ ์งํฉ์ ์์๋ค์ ์ถ๊ฐํ๋ค.
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
System.out.println(ts);
}
}
์ฒ๋ฆฌ๊ฒฐ๊ณผ
[A, B, C, D, E, F]
Map์ Key-Value ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ธํฐํ์ด์ค์ด๋ค. Key๋ฅผ ํตํด Value๋ฅผ ๊ฒ์ํ๊ณ ์ถ๊ฐ, ์ญ์ ํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์๋ค.
Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ก๋ HashMap, TreeMap ๋ฑ์ด ์๊ณ ํน์ง์ ์๋์ ๊ฐ๋ค.
- HashMap : ์์๋ฅผ ๋ณด์ฅํ์ง ์์ง๋ง, ๊ฒ์๊ณผ ์ถ๊ฐ, ์ญ์ ๋ฑ์ ์์ ์์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- TreeMap : ์ ๋ ฌ๋ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๊ฒ์๊ณผ ์ถ๊ฐ, ์ญ์ ๋ฑ์ ์์ ์์๋ HashMap๋ณด๋ค ๋๋ฆด ์ ์๋ค.
- LinkedHashMap : ๋ฐ์ดํฐ์ ์ถ๊ฐ ์์๋ฅผ ์ ์งํ๋ค. HashMap๋ณด๋ค๋ ๋๋ฆฌ์ง๋ง ๋ฐ์ดํฐ ์ถ๊ฐ ์์๋ฅผ ๋ณด์ฅํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
- WeakHashMap : Key๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋ ๋๋ง๋ค ํด๋น Key์ Value๊ฐ ์๋์ผ๋ก ์ญ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- EnumMap : EnumMap์ Key๊ฐ Enum ํ์ ์ธ Key-Value ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋งต ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค. Key๊ฐ Enum ํ์ ์ด๊ธฐ ๋๋ฌธ์ (๋ด๋ถ์ ์ผ๋ก ordinal์ด๋ผ๋ ์์ฐจ์ ์ธ ์ ์๊ฐ์ ๊ฐ์ง๋ฏ๋ก) ํค ์์๊ฐ ๋ณด์ฅ๋๋ค.
Map์ ์ฝ๊ฒ ์๊ฐํ๋ฉด ์ฌ๋ฌผํจ์ ์ด์ ์ ๊ฐ์ ๊ฐ๋ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ฌ๋ฌผํจ์ ๋ฒํธ์ ํค๊ฐ ์ผ์นํ๋ฉด ํด๋น ํค๋ก ์ฌ๋ฌผํจ์ ์ด๊ณ , ๋ฌผ๊ฑด์ ๋ฃ๊ฑฐ๋ ๋นผ์ฌ ์ ์์ ๊ฒ์ด๋ค. ๋ฅผ ์ฌ๋ฌผํจ์ด ๋ฐฉ๋ํ๋ค๋ฉด ํค์ ์ฌ๋ฌผํจ์ ๋ฒํธ๋ง ํ์ธ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ฉด ์ํ๋ ์์น๋ก ๋ฐ๋ก ๊ฐ์ ์ฌ๋ฌผํจ์ ์กฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ธก๋ฉด์์ ์ด๋์ ๊ฐ์ง ๊ฒ์ด๋ค.
- ํ๋์ ์ฌ๋ฌผํจ ์ด์ ๊ฐ ๋ค๋ฅธ ์ฌ๋ฌผํจ๊น์ง ์ด์ ์๋ค๋ฉด ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋๋ฏ Map์์๋ ํค๋ ์ ์ผ(Unique) ํด์ผํ๋ค.
- Map์๋ ์์๊ฐ ์๋ค - List์ Set์ด ์์๋ ์งํฉ์ ์ธ ๊ฐ๋ ์ ์ธํฐํ์ด์ค๋ผ๋ฉด Map์ ๊ฒ์์ ๊ฐ๋ ์ด ๊ฐ๋ฏธ๋ ์ธํฐํ์ด์ค์ด๋ค.
- Map ์ธํฐํ์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ Key์ Value์ ํํ๋ก ์ฝ์ ๋๋ฉฐ, Key๋ฅผ ์ด์ฉํด์ Value๋ฅผ ์ป์ ์ ์๋ค.
- Map์ ์์๊ฐ ์๋ค.
๊ฐ๋จํ ์ฌ์ฉ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
/**
* @author CodeVillains
* @description : Map ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
// Key : ํ์๋ฒํธ , value : ์ด๋ฆ - map.put์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
map.put(1, "ํ๊ธธ๋์ด");
map.put(2, "Samsig");
map.put(3, "Harunote");
map.put(100, "Kakao");
System.out.println(map);
System.out.println(map.get(100));
// ๊ฐ ์ฐพ๊ธฐ (Key ํน์ Value) ์กด์ฌํ๋ฉด True
System.out.println(map.containsKey(3));
System.out.println(map.containsValue("Samsig"));
// ํค๋ฅผ Set์ ๋ด๊ธฐ, Key๋ Integer ๋ก ์ ์ ๋์ด์๋ค.
Set<Integer> keys = map.keySet();
System.out.println(keys);
// ๊ฐ์ Collection์ ๋ด๊ธฐ, Value๋ String์ผ๋ก ์ ์ ๋์ด์๋ค.
Collection<String> values = map.values();
System.out.println(values);
}
}
์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด์.
{1=ํ๊ธธ๋์ด, 2=Samsig, 3=Harunote, 100=Kakao}
Kakao
true
true
[1, 2, 3, 100]
[ํ๊ธธ๋์ด, Samsig, Harunote, Kakao]
Map ์ Key ์ Value ์ ์์ผ๋ก ๋ฐ์ดํฐ ํ์ ์ด ์ ์ ๋์ด์๊ณ , Key๋ ์ค๋ณต๋ ์ ์๋ค๊ณ ํ๋ค.
๋ฌผ๋ก , Key ์ ๋์ํ๋ Object ํ์ ์ ๋น์ ์ ์ ํด์ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค.
์๋ฅผ๋ค์ด UserVO์ UserName ๊ณผ UserMail ์ฃผ์๋ก ํค๊ฐ ํ์ฑ์ด ๋๋ค๋ฉด map.put(new UserVO(UserName, UserMail), value)
ํํ๋ก๋ ํค๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
๋งต๊ณผ ๊ด๋ จ๋ ์ฃผ์ ์ธํฐํ์ด์ค๋ ์๋์ ๊ฐ๋ค.
๋งต์ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ปฌ๋ ์ ์ ์๋์ง๋ง entrySet ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋งต์ ์ปฌ๋ ์ ๋ทฐ๋ฅผ ์ป์ ์ ์๋ค.
๋ง์ฝ key์ ์ปฌ๋ ์ ๋ทฐ๋ฅผ ์ป๊ธฐ ์ํด์๋ keySet ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ ๋ํ ์ฝ๋ ์ ๋ทฐ๋ values ๋ฉ์๋๋ก ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค | ์ค๋ช |
---|---|
Map | ์ ์ผํ ํค์ ๊ฐ์ ์ฐ๊ฒฐ(map)ํ๋ค. |
Map.Entry | ๋งต์ ์๋ ์์(ํค/๊ฐ ์)์ ํํํ๋ค. Map ์ธํฐํ์ด์ค์ ๋ด๋ถ ํด๋์ค์ด๋ค. |
SortedMap | ํค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์งํ๊ธฐ ์ํด์ Map ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํ๋ค. |
AbstractMap์ด ๋ชจ๋ ์ค์ ๋งต ๊ตฌํ์ ์ต์์ ํด๋์ค์ด๋ค.
ํด๋์ค | ์ค๋ช |
---|---|
AbstractMap | Map ์ธํฐํ์ด์ค์ ๋๋ถ๋ถ์ ๊ตฌํํ๋ค. |
HashMap | ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์ AbstractMap์ ํ์ฅํ๋ค. |
TreeMap | ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ AbstractMap์ ํ์ฅํ๋ค. |
WeakHashMap | ์ทจ์ฝ ํค(weak key)๋ฅผ ๊ฐ๋ ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์ AbstractMap์ ํ์ฅํ๋ค. |
LinkedHashMap | ์ฝ์ -์์ ๋ฐ๋ณต์ ํ์ฉํ๊ธฐ ์ํด์ HashMap์ ํ์ฅํ๋ค. |
IdentityHashMap | AbstractMap์ ํ์ฅํ๊ณ ์์(document)๋ฅผ ๋น๊ตํ ๋ ์ฐธ์กฐ๊ฐ ๊ฐ์์ง ๋น๊ตํ๋ค. |
Map์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ํด์ํ ์ด๋ธ์ ์ฌ์ฉํ ํด๋์ค๋ก. ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
Map์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ธ๋ค*.*
key ๋๋ value ๊ฐ์ผ๋ก์จ null์ด ํ์ฉ๋๋ค.
/**
* @author CodeVillains
* @description : HashMap ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo {
public static void main(String args[]) {
// ํด์ ๋งต์ ๋ง๋ ๋ค.
Map<String, Double> hm = new HashMap<String, Double>();
// ๋งต์ ์์๋ค์ ๋ฃ๋๋ค.
hm.put("ํ๊ธธ๋์ด", new Double(1240.34));
hm.put("๊น์์์ด", new Double(223.39));
hm.put("ํต๊ตฐ", new Double(1378.00));
hm.put("๊ธ๋ผ์ด๋๋", new Double(9999.55));
hm.put("์กด ๋", new Double(-122.08));
hm.put("ํํจ์ฃผ๋", null);
// ๋งต ์ํธ๋ฆฌ์ ์ปฌ๋ ์
์งํฉ์ ๊ฐ์ ธ์จ๋ค.
Set<?> set = hm.entrySet();
// ๋ฐ๋ณต์๋ฅผ ์ป๋๋ค.
Iterator<?> i = set.iterator();
// ์์๋ค์ ์ถ๋ ฅํ๋ค.
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
// ์กด ๋์ ๊ณ์ข์ 1000์ ์๊ธํ๋ค.
double bonus = hm.get("์กด ๋").doubleValue();
hm.put("์กด ๋", new Double(bonus + 1000));
System.out.println("์กด ๋'s new deposit: " + hm.get("์กด ๋"));
}
}
์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
ํต๊ตฐ: 1378.0
ํํจ์ฃผ๋: null
ํ๊ธธ๋์ด: 1240.34
๊ธ๋ผ์ด๋๋: 9999.55
์กด ๋: -122.08
๊น์์์ด: 223.39
์กด ๋'s new deposit: 877.92
HashMap ์ ์ฃผ์ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
void clear() | HashMap์ ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐ. |
Object clone() | ํ์ฌ HashMap์ ๋ณต์ ํ์ฌ ๋ฐํ. |
boolean containsKey(Object key) | HashMap์ ์ง์ ๋ ํค(key)๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด true ๋ฆฌํด |
boolean containsValue(Object key) | HashMap์ ์ง์ ๋ ๊ฐ(value)๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด true ๋ฆฌํด |
Set entrySet() | HashMap์ ์ ์ฅ๋ ํค์ ๊ฐ์ ์ํธ๋ฆฌ(ํค์ ๊ฐ์ ๊ฒฐํฉ)์ ํํ๋ก Set์ ์ ์ฅํ์ฌ ๋ฐํ. |
Object get(Object key) | ์ง์ ๋ ํค(Key)์ ๊ฐ(๊ฐ์ฒด)์ ๋ฐํ. |
boolean isEmpty() | HashMap์ด ๋น์ด ์๋์ง ํ์ธ. |
Set keySet() | HashMap์ ์ ์ฅ๋ ๋ชจ๋ ํค๊ฐ ์ ์ฅ๋ Set์ ๋ฐํ. |
Object put(Object key, Object value) | HashMap์ ํค์ ๊ฐ์ ์ ์ฅ. |
void putAll(Map m) | Map์ ํด๋นํ๋ ๋ชจ๋ ์์๋ฅผ HashMap์ ์ ์ฅ. |
Object remove(Object key) | HashMap์์ ์ง์ ๋ ํค๋ก ์ ์ฅ๋ ๊ฐ(๊ฐ์ฒด)๋ฅผ ์ ๊ฑฐ. |
int size() | HashMap์ ์ ์ฅ๋ ์์์ ๊ฐ์๋ฅผ ๋ฐํ |
์ด์ง๊ฒ์ํธ๋ฆฌ์ ํํ๋ก ํค์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ ๋ ฌ๋ ์์๋ก ํค/๊ฐ ์์ ์ ์ฅํ๋ฏ๋ก ๋น ๋ฅธ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ ์ฅ์ ์ด ์๋ค.
ํด์๋งต๊ณผ๋ ๋ฌ๋ฆฌ, ํธ๋ฆฌ๋งต์ ์์๋ค์ด ํค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ์ฅ ๋ฉ๋๋ค. ๋ํ ์ ์ฅ์ ์ ๋ ฌ๋ ๊ฐ์ด ํ๊ธฐ ๋๋ฌธ์ ์ ์ฅ์๊ฐ์ด ๋ค์ ์ค๋ ๊ฑธ๋ฆฐ๋ค.
์๊น์ ์์ ๋ฅผ TreeMap์ผ๋ก ๋ณํํ์ฌ ์์ฑํด๋ณด๋๋ก ํ์.
/**
* @author CodeVillains
* @description : TreeMap ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String args[]) {
// ํด์ ๋งต์ ๋ง๋ ๋ค.
Map<String, Double> tm = new TreeMap<String, Double>();
// ๋งต์ ์์๋ค์ ๋ฃ๋๋ค.
tm.put("ํ๊ธธ๋์ด", new Double(1240.34));
tm.put("๊น์์์ด", new Double(223.39));
tm.put("ํต๊ตฐ", new Double(1378.00));
tm.put("๊ธ๋ผ์ด๋๋", new Double(9999.55));
tm.put("์กด ๋", new Double(-122.08));
tm.put("ํํจ์ฃผ๋", null);
// ๋งต ์ํธ๋ฆฌ์ ์ปฌ๋ ์
์งํฉ์ ๊ฐ์ ธ์จ๋ค.
Set<?> set = tm.entrySet();
// ๋ฐ๋ณต์๋ฅผ ์ป๋๋ค.
Iterator<?> i = set.iterator();
// ์์๋ค์ ์ถ๋ ฅํ๋ค.
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
// ์กด ๋์ ๊ณ์ข์ 1000์ ์๊ธํ๋ค.
double bonus = tm.get("์กด ๋").doubleValue();
tm.put("์กด ๋", new Double(bonus + 1000));
System.out.println("์กด ๋'s new deposit: " + tm.get("์กด ๋"));
}
}
๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด Key ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅ๋จ์ ์์ ์๋ค.
๊ธ๋ผ์ด๋๋: 9999.55
๊น์์์ด: 223.39
์กด ๋: -122.08
ํต๊ตฐ: 1378.0
ํํจ์ฃผ๋: null
ํ๊ธธ๋์ด: 1240.34
์กด ๋'s new deposit: 877.92
LinkedHashMap์ ๊ธฐ๋ณธ์ ์ผ๋ก HashMap์ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ HashMap๊ณผ ๋งค์ฐ ํก์ฌํฉ๋๋ค. ์ฐจ์ด์ ์ Map์ ์๋ ์ํธ๋ฆฌ๋ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ ์งํ๋ค๋ ์ ์ด๋ค. ์ฆ, Map์ ์ ์ฅ๋ ์ฝ์ -์์๋ก ๋ฐ๋ณตํ๋๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
๋๊ฐ์ ์์ ๋ฅผ LinkedHashMap ํ์ ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ํ ์คํธ ํด๋ณด์.
์ ๋ ฅ๋ฐ์ ์์๋๋ก ์ถ๋ ฅ๋จ์ ํ์ธ ํ ์ ์๋ค.
HashMap๋ณด๋ค๋ ๋๋ฆฌ์ง๋ง ๋๊ธฐํ๊ฐ ์ง์๋๋ค. HashMap ๊ณผ๋ ๋ค๋ฅด๊ฒ null ๊ฐ์ ํ์ฉํ์ง ์์ต๋๋ค.
HashMap ์ ๋๊ธฐํ ๋ธ๋ญ์ ํตํด ์ฝ๋ฉํ ๊ฒฝ์ฐ(Collections.synchronizedMap(new HashMap(...))) ๋ณด๋ค๋ ์๋๊ฐ ๋น ๋ฅด๋ค๊ณ ์๋ ค์ ธ ์๋ค.
์๋์ ์์ ๋ฅผ ์คํํด๋ณด๋๋ก ํ์.
/**
* @author CodeVillains
* @description : Hashtable ๋ฐ๋ชจ
*/
package com.codevillains.collection;
import java.util.Enumeration;
import java.util.Hashtable;
public class HashTableDemo {
public static void main(String args[]) {
// Create a hash map
Hashtable<String, Double> ht = new Hashtable<String, Double>();
Enumeration<String> names;
String str;
ht.put("ํ๊ธธ๋์ด", new Double(1240.34));
ht.put("๊น์์์ด", new Double(223.39));
ht.put("ํต๊ตฐ", new Double(1378.00));
ht.put("๊ธ๋ผ์ด๋๋", new Double(9999.55));
ht.put("์กด ๋", new Double(-122.08));
ht.put("ํํจ์ฃผ๋", new Double(55.77));
names = ht.keys();
while (names.hasMoreElements()) {
str = (String) names.nextElement();
System.out.println(str + ": " + ht.get(str));
}
System.out.println();
double bonus = ((Double) ht.get("์กด ๋")).doubleValue();
ht.put("์กด ๋", new Double(bonus + 1000));
System.out.println("์กด ๋'s new deposit: " + ht.get("์กด ๋"));
}
}
์คํ๊ฒฐ๊ณผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
๊ธ๋ผ์ด๋๋: 9999.55
ํต๊ตฐ: 1378.0
ํํจ์ฃผ๋: 55.77
์กด ๋: -122.08
๊น์์์ด: 223.39
ํ๊ธธ๋์ด: 1240.34
์กด ๋'s new deposit: 877.92
- Hashtable, HashMap์ ๊ณตํต์
- ๋ด๋ถ์ ์ผ๋ก ๋ชจ๋ Hash ๊ธฐ๋ฒ์ ์ด์ฉํ๋ค
- Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค
- Key์ Value๋ฅผ ์ด์ฉํด์ Data๋ฅผ ๊ด๋ฆฌํ๋ค
- Hashtable, HashMap์ ์ฐจ์ด์
- Hashtable์ ๋๊ธฐํ๊ฐ ๋ณด์ฅ๋๋ค
- HashMap์ ๋๊ธฐํ๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค
- HashMap์ ๋๊ธฐํ ์ง์ ๋ฐฉ๋ฒ : Map m = Collections.synchronizedMap(New HashMap(...));
- Hashtable, HashMap๊ณผ HashSet๊ณผ์ ๊ด๊ณ
- Hashtable๊ณผ HashMap์ ๋ ๋ค Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค
- HashSet์ ๋ด๋ถ์ ์ผ๋ก Hash๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง๋ง Set์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค
ํน์ง | HashMap | Hashtable |
---|---|---|
๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ | Map map = new HashMap(); | Map hashtable = new Hashtable(); |
์ฃผ์ ํน์ง | ๋จ์ผ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ข์ ์๋ฃ๊ตฌ์กฐ | ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๊ธฐ ์ข์ ์๋ฃ๊ตฌ์กฐ (synchronized ๊ฐ ๋ถ์ด์๋ค.) |
thread-safe ํ์ง๋ง hashmap ๋ณด๋ค ๋๋ฆฌ๋ค. |
Collection์ ํตํด ์์ฃผ ์ฐ๋ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์์ ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค. ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์ค๋์ง ์ดํด๋ณด์.
package com.codevillains.collection;
/**
* @author CodeVillains
*/
import java.util.*;
public class AlgorithmsDemo {
public static void main(String args[]) {
// ๋งํฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ด๊ธฐํํ๋ค.
LinkedList<Integer> ll = new LinkedList<Integer>();
ll.add(new Integer(-8));
ll.add(new Integer(20));
ll.add(new Integer(-20));
ll.add(new Integer(8));
// ์ญ์์ ๋น๊ต์๋ฅผ ์์ฑ.
Comparator<Integer> r = Collections.reverseOrder();
// ๋น๊ต์๋ฅผ ์ฌ์ฉํด์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค.
Collections.sort(ll, r);
// ๋ฐ๋ณต์๋ฅผ ์ป๋๋ค.
Iterator<Integer> li = ll.iterator();
System.out.print("List sorted in reverse: ");
while (li.hasNext()) {
System.out.print(li.next() + " ");
}
System.out.println();
Collections.shuffle(ll);
// ์์์ ๋ฆฌ์คํธ๋ฅผ ํ์ํ๋ค.
li = ll.iterator();
System.out.print("List shuffled: ");
while (li.hasNext()) {
System.out.print(li.next() + " ");
}
System.out.println();
System.out.println("Minimum: " + Collections.min(ll));
System.out.println("Maximum: " + Collections.max(ll));
}
}
Collections ํด๋์ค์๋ ์ ๋ ฌ์ด๋ ์์ ์กฐํฉ์ ์ํ ๋ค์ํ ๋ฉ์๋๋ค์ ์ง์ํฉ๋๋ค.
๋ฉ์๋ | ์ค๋ช |
---|---|
Collections.copy(list, list) | ์ปฌ๋ ์ ์์๋ค์ ๋ณต์ฌํ๋ค. |
Collections.reverse(list) | list ์์์ ์์๋ฅผ ๋ฐ๋๋ก ๋ณ๊ฒฝํ๋ค. |
Collections.reverseOrder() | list ์์์ ์์๋ฅผ ์ญ์์ผ๋ก ์ ๋ ฌํ๋ค. |
Collections.shuffle(list) | list ์์๋ฅผ ๋ณ๊ฒฝํ๋ค.(Shuffle) |
Collections.sort(list) | list ๋ฅผ ์ ๋ ฌํ๋ค. |
Collections.min(list) | list ์ ์์์ค ๊ฐ์ฅ ์์๊ฐ์ ๋ฐํํ๋ค. |
Collections.max(list) | list ์ ์์์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐํํ๋ค. |
๋ค์ ๊ฐ์ข์์ ์ ๋ ฌ์ ๋ํด์๋ ๋ค์ ์์ ๋ก ์ค๋ช ํ ์์ ์ด๋ค.
์คํ ๊ฒฐ๊ณผ๋ shuffle ์ ๋ฐ๋ผ ๋ค์ ๋ค๋ฅด๊ฒ ์ง๋ง ์๋์ ๊ฐ๋ค.
List sorted in reverse: 20 8 -8 -20
List shuffled: -8 8 20 -20
Minimum: -20
Maximum: 20
์๋ฃ๊ตฌ์กฐ์ ๊ตฌ๋ถ์ด๋ ์ปฌ๋ ์ ์ ๊ณ์ธต๋, ๋งต ๊ณ์ด์ ๊ณ์ธต๋๋ฅผ ํตํด ์ข ๋ ์์์ด๋ ๊ตฌํ๊ด๊ณ๋ฅผ ์ดํดํ ์ ์์ด์ผ ํ๋ฉฐ, ๋ด๋ถ ํ์ฉ ๋ฉ์๋๋ค์ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ฏ๋ก ๊ผญ ํ๋ฒ์ฏค ์ ๋ฆฌ ํด๋ณด๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ค์ํ ์๊ตฌ์ฌํญ์ ์ง๋ฉดํ๊ฒ ๋๋ค. ๋น๋จ ๊ณ ๊ฐ์ฌ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๊ฐ๋ฐํ๋ SI์ ๊ตญํ๋๊ฒ์ด ์๋๋ผ ์ ํ์ ๋ง๋ค๋ ํ๋ฉด ๋ ๋ฒจ์์ Ajax ์ ๊ฐ์ Asyc ์ฒ๋ฆฌ์์ URL ํธ์ถ ํ ๋ด๋ ค ๋ฐ์ ๋ฐ์ดํฐ๋ค์ DB๋ฅผ ์ต์ธ์ค ํ์ง ์๊ณ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด์ผ ํ๋ ์ํฉ์ด ์จ๋ค๋ฉด Collection Framework ์ ์ด์ฉํ์ฌ ์ถฉ๋ถํ ํด๊ฒฐํ ์ ๋ ์๋ค.
์ ๋ ฌ (Sort) - ๋ฐฐ์ด ๋์ด ์๋ ์๋ฃ๋ค์ ํฐ ์์, ์์ ์์๋ก ์ฌ ๋ฐฐ์ด ํ๋ ๊ฒ์ ๋งํ๋ค. ์ผ๋ฐ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ผ ํ ๊ฐ๋ ๋ค์ ์๋์ ๊ฐ๋ค.
-
์ ํ ์ ๋ ฌ (Selection Sort) : ์ฃผ์ด์ง ๋ฆฌ์คํธ์์ ์ต์๊ฐ์ ์ฐพ์ ๋งจ ์์ ์์น๊ฐ๊ณผ ๋น๊ตํ์ฌ ๊ต์ฒดํ๋ค. ๋ชฉ๋ก์ ๊ฐ ์์น์ ๋ํด์ ์ด๋ฌํ ๊ณผ์ ์ ๊ณ์ํ๋ค.
O(n^2) ์ ํผํฌ๋จผ์ค๊ฐ ๋์จ๋ค.
-
๋ฒ๋ธ ์ ๋ ฌ (Bubble Sort) : ๊ตฌ์ฑ ์์๋ฅผ ์ํํ๋ฉด์ ์ธ์ ํ ๋๊ฐ์ ์์๋ฅผ ๋น๊ตํ์ฌ ์๋ฆฌ๋ฅผ ๊ตํํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌ์ ์์ฑํ๋ค. ๋ค์ ๊ฐ์ด ์์ผ๋ฉด ์์ผ๋ก ์์น๋ฅผ ๋ฐ๊ฟ์ค์ผ ํด์ ๊ฐ๋ณ๊ณต๊ฐ์ด ํ๋ ํ์ํ๋ค.
ํผํฌ๋จผ์ค๊ฐ ๋นํจ์จ์ ์ด๋ค. ์ต์ ์ ๊ฒฝ์ฐ ์ญ์์ผ๋ก ์ ๋ ฌํ๋ ค๊ณ ํ ๋ O(n^2)๊ฐ ๋์ค๊ณ ์ต์ ์ ๋ฆฌ์คํธ๊ฐ ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์์ ๊ฒฝ์ฐ O(N)์ ์ฑ๋ฅ์ด ๋์จ๋ค.
-
ํต ์ ๋ ฌ (Quick Sort) : ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ํ์ฌ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ด ์ข๋ค.
๊ธฐ์ค๊ฐ์ ์ค์ฌ์ผ๋ก ์์กฑ ๋ถ๋ถ ์งํฉ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ์งํฉ์ผ๋ก ๋ถํ ํ ํ ์ผ์ชฝ์ ์์๊ฐ์, ์ค๋ฅธ์ชฝ์ ๊ธฐ์ค๊ฐ ๋ณด๋ค ํฐ ๊ฐ์ ์ด๋์ํจ๋ค. ์ด๋ฐ ๋ฐฉ์์ ์ํ์ ์ผ๋ก ๋ฐ๋ณตํ์ฌ(๊ฐ๊ฐ quick sort๋ก ๋ฆฌ์ปฌ์๋ธํ๊ฒ ์ฐ์ฐ) ์ ๋ ฌ์ ์์ฑํ๋ค.
ํผํฌ๋จผ์ค๋ O(n log n), worst case O(n^2) : ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ์์ ์คํํ ๊ฒฝ์ฐ
-
์ฝ์ ์ ๋ ฌ (Insertion Sort) : ์ฝ์ ์ ๋ ฌ, ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ถ๋ถ๊ณผ ๋น๊ตํ์ฌ, ์์ ์ ์์น๋ฅผ ์ฐพ์ ์ฝ์ ํจ.
๋์์ ๊ธฐ์ค๊ฐ์ ์ผ์ชฝ ์์๋ถํฐ ๋น๊ตํด์ ๊ธฐ์ค๊ฐ์ ํฌ๊ธฐ๊ฐ ๋น๊ต๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ๋๊ฐ์ ์์น๋ฅผ ๋ฐ๊ฟ์ฃผ๊ณ ๊ธฐ์ค๊ฐ์ ์ ์ฅํ๋ค. (๋ฐ๋ณตํ๋ฉด์ ์ ๋ ฌ)
O(n^2) ์ ํผํฌ๋จผ์ค๊ฐ ๋์จ๋ค.
-
๋ณํฉ ์ ๋ ฌ (Merge Sort) : (Divide & Conquer) : ์์ ์ ์ธ ์ ๋ ฌ
์ฃผ์์ง ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ฉ ๋๋์ ์ ๋ ฌํ ํ ํ๋๋ก ํฉ์น๋ ๋ฐฉ์
๋ ๋ฒ์ ์ฌ๊ท ํธ์ถ๊ณผ ํ ๋ฒ์ ํฉ๋ณ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ ์ฌ๊ท ํธ์ถ ์ ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด ๋ค์ด ๊น์ด๊ฐ log n ์ผ๋ก ๋๋ค.
์ฆ, ๋ ๋ฐฐ์ด์ ํฉ์ ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ์ ํฉ์ ๋น๋ก ํจ์ผ๋ก ์ ์ฒด ์ํ ์๊ฐ ๋ณต์ก๋๋ ์ต์ , ์ต์ , ํ๊ท ๋ชจ๋ O(n log n).
๋ถํ ์ ๋ณต ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ ํ ์ข ๋ฅ (1/2 ์ฉ ๋ถํ )
ํผํฌ๋จผ์ค๋ O(n log n)
์์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํ์ ์ธ ์ ๋ ฌ ๋ฐฉ์๊ณผ๋ ๋ณ๊ฐ๋ก, ์ค๋ฌด๋ฅผ ํ๋ค๋ณด๋ฉด View ํ์ด์ง ํน์ ๋ก์ง ๋ด๋ถ์์ ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์๊ณผ ๊ฐ์ ์ ๋ ฌ์ ๊ตฌํํด์ผ ํ ๋๊ฐ ์๋ค. ํ์์ ๊ฒฝ์ฐ ์ค๋ฌด์์ ๊ฐ๋๋ค, ABC, 123์ ์์๋๋ก ์ถ๋ ฅํด๋ฌ๋ผ๋ ์๊ตฌ๋ ๋ฐ์๋ณธ ์ ์ด ์๋ค. (์ด ๋ถ๋ถ์ ๋ํ ์ฒ๋ฆฌ๋ ์ด๋ฒ ์ฑํฐ ์ ์ผ ๋ค์ ๋์จ๋ค.)
์ด๋ฌํ ์ ๋ฌด ์๊ตฌ์ฌํญ์ ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ๋ ๋ณ๊ฐ๋ก ๊ต์ฅํ ํํ๊ณ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ฐ๋ก ๊ตฌํ์ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ฐ์์๋ ์ ๋ ฌ์ ๊ตฌํํ ๋ ๊ฐ์ฅ ๋จผ์ ์์๋์ด์ผํ Interface๊ฐ ์๋๋ฐ ๋ฐ๋ก Comparable ๊ณผ Comparator ์ธํฐํ์ด์ค์ด๋ค.
- Comparable ์ธํฐํ์ด์ค๋ java.lang.lang์ ์กด์ฌํ๋ค.
- int compareTo(T o) ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ๋ด๋ถ์์ ์์๋ฅผ ์ ๋ ฌ
- Comparator ์ธํฐํ์ด์ค๋ java.util.Comparator ํจํค์ง์ ์กด์ฌํ๋ค.
- int compare(T o1, T o2) ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ๋ ๊ฐ์ฒด๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ์ ๋ ฌ
๋ฌผ๋ก ์์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์์ฝ๊ฒ sort ๋ฅผ ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ TreeMap, TreeSet ๊ณผ ๊ฐ์ ์๋ฃํ์ ์ด์ฉํ์ฌ ๋ด๋ถ์ ๋ ฌ์ ํ ์๋ ์๊ฒ ๋ค.
/**
* @author CodeVillains
* @description : Collections.sort()๋ฅผ ์ด์ฉํ ์ ๋ ฌ ๋ฐ๋ชจ
*/
package com.codevillains.collection.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListSort {
public static void main(String args[]) {
List<String> listObject = new ArrayList<String>();
listObject.add("z");
listObject.add("a");
listObject.add("f");
listObject.add("c");
System.out.println("##๊ธฐ๋ณธ์ถ๋ ฅ : " + listObject);
// ๋ฌธ์์ด์์ผ๋ก ์ ๋ ฌ
Collections.sort(listObject, String.CASE_INSENSITIVE_ORDER);
System.out.println("##์์ฐจ์ ๋ ฌ : " + listObject);
// ์ญ์์ผ๋ก ์ ๋ ฌ
Collections.sort(listObject, Collections.reverseOrder());
System.out.println("##์ญ์์ ๋ ฌ : " + listObject);
}
}
Collections.sort(listObject, String.CASE_INSENSITIVE_ORDER); ๋ฅผ ์ด์ฉํด์ ์์ฐจ์ ๋ ฌ์, Collections.reverseOrder()๋ฅผ ์ด์ฉํด์ ์ญ์์ ๋ ฌ์ ์๋ ํ์๋ค.
์ถ๋ ฅ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
##๊ธฐ๋ณธ์ถ๋ ฅ : [z, a, f, c]
##์์ฐจ์ ๋ ฌ : [a, c, f, z]
##์ญ์์ ๋ ฌ : [z, f, c, a]
๋ฌธ์์ด์ ์ ๋ ฌ์ผ ๊ฒฝ์ฐ ๋ฐ๋ก Interface๋ฅผ Implements ํ์ง ์์๋ ์๋์ผ๋ก ๋๋ค. ์ด์ ๋ํ ์ค๋ช ์ ์๋ ์์ ๋ฅผ ํ๋ฒ ๋ ์ดํด๋ณธํ์ ํ๊ฒ ๋ค.
์๋๋ Array ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ ์์ ์ด๋ค.
/**
* @author CodeVillains
* @description : Array.sort()๋ฅผ ์ด์ฉํ ์ ๋ ฌ ๋ฐ๋ชจ
*/
package com.codevillains.collection.sort;
import java.util.Arrays;
public class ArraySort {
public static void main(String[] args) {
String[] s = { "b", "A", "D", "C", "a", "F" };
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ฌ ์ ๋ ฌ
Arrays.sort(s);
System.out.println("# ๋์๋ฌธ์ ๊ตฌ๋ถ");
System.out.println(Arrays.toString(s));
descArraySort(s);
System.out.println("# ์ญ์ ๋ ฌ ");
System.out.println(Arrays.toString(s));
// ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ์ ๋ ฌ
System.out.println("# ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ");
Arrays.sort(s, String.CASE_INSENSITIVE_ORDER);
System.out.println(Arrays.toString(s));
}
public static void descArraySort(String[] arr) {
String temp;
for (int i = 0; i < arr.length / 2; i++) {
temp = arr[i];
arr[i] = arr[(arr.length - 1) - i];
arr[(arr.length - 1) - i] = temp;
}
}
}
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
# ๋์๋ฌธ์ ๊ตฌ๋ถ
[A, C, D, F, a, b]
# ์ญ์ ๋ ฌ
[b, a, F, D, C, A]
# ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด
[a, A, b, C, D, F]
Array.sort ๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์์ด์ ์ ๋ ฌํ์๋ค. ๋จ์ํ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ฌ ์ ๋ ฌํ๊ณ , ๋ค์ ์ญ์ ๋ ฌ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์ถ๋ ฅํ ํ ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด (String.CASE_INSENSITIVE_ORDER) ์ถ๋ ฅํ์๋ค.
Sort ๋ฅผ ํตํด ์์ฐจ์ ์ผ๋ก ์ ๋ ฌ์ด ๋๋ ์ด์ ๋ ๋น์ฐํ๊ฒ ์ง๋ง ์๋ฐ์ String ํด๋์ค๊ฐ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ๋ฐ๋ผ์ ์ํ๋ฒณ ์์๋ก ์ ๋ ฌํ๋๋ก compareTo ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์์ด์ด ์๋ ๊ฐ์ฒด์ ์ ๋ ฌ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น?
์ด๋ฅผํ ๋ฉด ๊ฒ์ํ์์ ๊ฒ์๋ฌผ์ ์์(BoardType ์ด๋ผ๋ Object์ ์กด์ฌํ๋ ๊ฒ์๋ฌผ ์๋ฒ ์ด๋ผ๋๊ฐ) ์ ์ ๋ช ํน์ ID ๊ฐ์ ํ๋ฌํผํฐ ๊ธฐ์ค์ผ๋ก ํ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ?
์ด ๋์๋ (String์์ ์๋์ผ๋ก ๋์ํ๋ Comparable ์ธํฐํ์ด์ค์ฒ๋ผ) ๊ฐ์ฒด์์ Comparable ์ implements ํ์ฌ compareTo ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๊ฒ์๋ฌผ๋ก ์ ๋ ฌํ๋ ์๋ผ๊ณ ์๊ฐํ๊ณ ์๋๋ฅผ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
//ํ์ฌ ๋์ด์จ ๋งค๊ฐ๋ณ์์ Board ๋ณ์์ title์ ๋น๊ตํ์ฌ ์ ๋ ฌํ๋ค.
public int compareTo(Object o){
reutrn title.compareTo(((Board)o).title);
}
๋น์ฐํ ์ด Board๋ผ๋ ๊ฐ์ฒด์ Comparable ์ธํฐํ์ด์ค๋ฅผ implements ํด์ค์ผ ํ๋ฏ๋ก compareTo๋ฅผ ๊ตฌํํ๊ฒ ๋๋๋ฐ ์ด๋ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ํ ๊ฒ์ธ๊ฐ์ ๋ฐ๋ผ ๋งค๊ฐ๋ณ์์ ๋น๊ต๋์ ๋ณ์๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.
compareTo ๋ก ๋์ด์ค๋ ๋งค๊ฐ๋ณ์๊ฐ ํ์ฌ ๋ณ์๋ณด๋ค ์์ ์กด์ฌํ๋ค๋ฉด ์์๋ฅผ, ๊ฐ๋ค๋ฉด 0์, ๋ค์ ์กด์ฌํ๋ค๋ฉด ์์๋ฅผ ๋ฆฌํด ํ๋ค.
์ด๋ ๊ฒ ๊ตฌํํ ํ ํด๋น ๊ฐ์ฒด์ ๋ฐฐ์ด๋ก ์ ๋ ฌํด์ผ ํ ๊ฒฝ์ฐ Arrays.sort(arr) ๋ฅผ, ๋ฆฌ์คํธ๋ก ์ ๋ ฌํด์ผ ํ ๊ฒฝ์ฐ Collections.sort(list)๋ก ํด๋ฒ๋ฆฌ๋ฉด ์ ๋ ฌ์ด ์ฒ๋ฆฌ ๋๋ค.
๋จผ์ ์ง๋ 10๋ ๊ฐ์ ์ฒญ๋ฃก์ํ์ ๋จ์ฐ ์ฃผ์ฐ์ ์์์๋ฅผ ๋ฝ์์ ๋ฐฐ์ฐ์ด๋ฆ์ด๋ ์์์ฐ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์์ ๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์๋๋ ๋ฐฐ์ฐ ์์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ Actor ํด๋์ค์ด๋ค.
/**
* @author CodeVillains
* @description : Comparable์ ์ด์ฉํ ์ ๋ ฌ ๋ฐ๋ชจ
*/
package net.harunote.collection.sort.actor;
class Actor implements Comparable<Object> {
String name;
String title;
int prizeYear;
// Constructor
public Actor(String name, String title, int birthYear) {
this.prizeYear = birthYear;
this.name = name;
this.title = title;
}
@Override
public String toString() {
return "์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {" + "๋ฐฐ์ฐ = " + name + ", ์ํ ์ ๋ชฉ [" + title + "]" + ", ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=" + prizeYear + '}';
}
// ์ ๋ ฌ๋ ๋ ๋ฐฐ์ฐ ์ด๋ฆ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
@Override
public int compareTo(Object o) {
return name.compareTo(((Actor) o).name);
}
}
๋ฐฐ์ฐ๋ช , ์ํ์ ๋ชฉ, ์์์ฐ๋๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ธ์คํด์ค ๋ณ์๋ฅผ ์ ์ธํ์๊ณ toString์ผ๋ก ์ถ๋ ฅํ๋ค.
Comparable
์ธํฐํ์ด์ค๋ ๊ฐ์ฒด๋ค ๊ฐ์ ์์๋ฅผ ์ ์ํ ์ ์๋๋ก ํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํจ์ผ๋ก์จ, ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ค์ ์ ๋ ฌํ๊ฑฐ๋ ์ด์ง ๊ฒ์ ๋ฑ์ ์ํํ๋ ๋ฑ์ ์์
์ ๋ ์ฝ๊ฒ ํ ์ ์๋ค.
์ ์ฝ๋์์ Actor ํด๋์ค๊ฐ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ด์ ๋, ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ค์ ์ด๋ฆ(name)์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์ ํ๊ธฐ ์ํจ์ด๋ฉฐ, Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด compareTo
๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉํ๋ ๊ท์น์ ์ ์ํ ์ ์๋ค. ์ ์ฝ๋์์ compareTo ๋ฉ์๋๋ name ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ Actor ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋๋ก ์ ์๋์ด ์๋ค.
๊ธฐ๋ณธ์ ๋ ฌ, ์์ ์ฐ๋ ์ ๋ ฌ, ์ด๋ฆ์ ๋ ฌ ๋ฑ์ผ๋ก ํ ์คํธ๋ฅผ ํด๋ณด๊ณ Array์ List, TreeSet ๋ฑ์ ์๋ฃํ์ผ๋ก ์ ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์คํธ ํ ํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์.
์ฝ๋๋ ์๋์ ๊ฐ๋ค.
/**
* @author CodeVillains
* @description : ์ฒญ๋ฃก์ํ์ 10๋
๊ฐ ์์์ ์ ๋ ฌ ์์
*/
package com.codevillains.collection.sort.actor;
import com.codevillains.collection.sort.actor.prizeYearComparator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
//์ฒญ๋ฃก์ํ์ ์์์ ์์
public class FilmFestival {
private static final Logger logger = LoggerFactory.getLogger(FilmFestival.class);
public static void main(String args[]) {
/* ์ฒญ๋ฃก์ํ์ 10๋
๊ฐ ์์์
33ํ(2012) - ์ต๋ฏผ์(ใ๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋ใ)
34ํ(2013) - ํฉ์ ๋ฏผ(ใ์ ์ธ๊ณใ)
35ํ(2014) - ์ก๊ฐํธ(ใ๋ณํธ์ธใ)
36ํ(2015) - ์ ์์ธ(ใ์ฌ๋ใ)
37ํ(2016) - ์ด๋ณํ(ใ๋ด๋ถ์๋คใ)
38ํ(2017) - ์ก๊ฐํธ(ใํ์์ด์ ์ฌใ)
39ํ(2018) - ๊น์ค์(ใ1987ใ)
40ํ(2019) - ์ ์ฐ์ฑ(ใ์ฆ์ธใ)
41ํ(2020) - ์ ์์ธ(ใ์๋ฆฌ๋ ์์ดใ)
42ํ(2021) - ์ค๊ฒฝ๊ตฌ(ใ์์ฐ์ด๋ณดใ)
43ํ(2022) - ๋ฐํด์ผ(ใํค์ด์ง ๊ฒฐ์ฌใ)
*/
Actor[] actors = new Actor[] {
new Actor("์ก๊ฐํธ", "๋ณํธ์ธ", 2014),
new Actor("์ ์์ธ", "์๋ฆฌ๋ ์์ด", 2020),
new Actor("ํฉ์ ๋ฏผ", "์ ์ธ๊ณ", 2013),
new Actor("์ก๊ฐํธ", "ํ์์ด์ ์ฌ", 2017),
new Actor("์ ์์ธ", "์ฌ๋", 2015),
new Actor("๊น์ค์", "1987", 2018),
new Actor("์ค๊ฒฝ๊ตฌ", "์์ฐ์ด๋ณด", 2021),
new Actor("์ต๋ฏผ์", "๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋", 2012),
new Actor("๋ฐํด์ผ", "ํค์ด์ง ๊ฒฐ์ฌ", 2022),
new Actor("์ด๋ณํ", "๋ด๋ถ์๋ค", 2016),
new Actor("์ ์ฐ์ฑ", "์ฆ์ธ", 2019)
};
logger.info("### ์ ๋ ฌ ์ ###");
consoleLog(List.of(actors));
Arrays.sort(actors);
logger.info("### ๊ธฐ๋ณธ ์ ๋ ฌ ํ (๋ฐฐ์ฐ์ด๋ฆ) ###");
consoleLog(List.of(actors));
List<Actor> list = Arrays.asList(actors); // ๋ฐฐ์ด์ ๋ฆฌ์คํธ๋ก
Collections.shuffle(list); // ๋ฆฌ์คํธ์ ์์๋ฅผ ์์.
logger.info("### List shuffle ํ ###");
consoleLog(list);
// ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌ (ํด๋์ค์ ์ ์๋ ๊ธฐ๋ณธ์ ๋ ฌ)
Collections.sort(list);
logger.info("### List ๊ธฐ๋ณธ ์ ๋ ฌ ํ ###");
consoleLog(list);
// ๋ํดํธ ์ ๋ ฌํ ์ ์๋ TreeSet์ ๋ง๋ ๋ค
Set<Actor> set = new TreeSet<>(list);
logger.info("### treeset ์ ์ฉ ํ ###");
consoleLog(set);
// ์ฐ๋๋ณ๋ก ์ ์ฉํ set
Set<Actor> yearSet = new TreeSet<>(new prizeYearComparator());
yearSet.addAll(list);
logger.info("### ์ต์ ์ฐ๋๋ณ ์ ๋ ฌ ํ ###");
consoleLog(yearSet);
}
private static void consoleLog(Collection<Actor> collection) {
for (Actor actor : collection) {
logger.info(actor.toString());
}
}
}
์์ ์ฐ๋๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํด prizeYearComparator๋ฅผ ๋ณ๋๋ก ๋ง๋ค์๋ค.
/**
* @author CodeVillains
* @description : Comparator ์ ๋ ฌ ๋ฐ๋ชจ
*/
package com.codevillains.collection.sort.actor;
import java.util.Comparator;
// ์์ ์ฐ๋๋ณ๋ก ์ ๋ ฌํ๊ธฐ ์ํด Comparator ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
class prizeYearComparator implements Comparator<Object> {
public int compare(Object o1, Object o2) {
int year1 = ((Actor) o1).prizeYear;
int year2 = ((Actor) o2).prizeYear;
return year1 > year2 ? -1 : (year1 == year2 ? 0 : 1);
}
}
prizeYearComparator ํด๋์ค๋ Actor ํด๋์ค์ prizeYear ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. compare ๋ฉ์๋์์๋ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์, prizeYear ํ๋๋ฅผ ๋น๊ตํ์ฌ ์ ๋ ฌํ๋ค.
๋น๊ต ๊ฒฐ๊ณผ์ ๋ฐ๋ผ์, ์์, 0, ์์๋ฅผ ๋ฆฌํดํ๋๋ฐ, year1์ด year2๋ณด๋ค ํฌ๋ค๋ฉด -1์ ๋ฆฌํดํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉฐ, year1๊ณผ year2๊ฐ ๊ฐ๋ค๋ฉด 0์ ๋ฆฌํดํ๋ค. year1์ด year2๋ณด๋ค ์๋ค๋ฉด 1์ ๋ฆฌํดํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
### ์ ๋ ฌ ์ ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [๋ณํธ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2014}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์๋ฆฌ๋ ์์ด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2020}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
### ๊ธฐ๋ณธ ์ ๋ ฌ ํ (๋ฐฐ์ฐ์ด๋ฆ) ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [๋ณํธ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2014}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์๋ฆฌ๋ ์์ด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2020}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
### List shuffle ํ ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์๋ฆฌ๋ ์์ด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2020}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [๋ณํธ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2014}
### List ๊ธฐ๋ณธ ์ ๋ ฌ ํ ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [๋ณํธ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2014}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์๋ฆฌ๋ ์์ด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2020}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
### treeset ์ ์ฉ ํ ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
### ์ต์ ์ฐ๋๋ณ ์ ๋ ฌ ํ ###
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๋ฐํด์ผ, ์ํ ์ ๋ชฉ [ํค์ด์ง ๊ฒฐ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2022}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ค๊ฒฝ๊ตฌ, ์ํ ์ ๋ชฉ [์์ฐ์ด๋ณด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2021}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์๋ฆฌ๋ ์์ด], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2020}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์ฐ์ฑ, ์ํ ์ ๋ชฉ [์ฆ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2019}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ๊น์ค์, ์ํ ์ ๋ชฉ [1987], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2018}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [ํ์์ด์ ์ฌ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2017}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ด๋ณํ, ์ํ ์ ๋ชฉ [๋ด๋ถ์๋ค], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2016}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ ์์ธ, ์ํ ์ ๋ชฉ [์ฌ๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2015}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ก๊ฐํธ, ์ํ ์ ๋ชฉ [๋ณํธ์ธ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2014}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ํฉ์ ๋ฏผ, ์ํ ์ ๋ชฉ [์ ์ธ๊ณ], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2013}
์์ ๋ฐฐ์ฐ ๋ชฉ๋ก {๋ฐฐ์ฐ = ์ต๋ฏผ์, ์ํ ์ ๋ชฉ [๋ฒ์ฃ์์ ์ ์: ๋์๋๋ค ์ ์ฑ์๋], ์ฒญ๋ฃก์ํ์ ๋จ์ฐ์ฃผ์ฐ์ ์์ ์ฐ๋=2012}
Sorting์ ์ํ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด Actor ํด๋์ค์ compareTo๋ฅผ Overriding ํ๊ณ ๋๋จธ์ง ์ ๋ ฌ์กฐ๊ฑด์ ์ํด Comparator๋ฅผ ์ด์ฉํ ์ ๋ ฌ์ ์ด์ฉ ํ์๋ค.
Comparator ์ธํฐํ์ด์ค๋ compare ๋ฅผ ๊ตฌํํด์ compareTo์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฆฌํดํด์ฃผ๋ฉด ์ ๋ ฌ์ด ์ํ๋๋ค.
์์ค์์ ์ฃผ์์ผ๋ก ์์ธํ ์ค๋ช ์ ํด๋์๊ธฐ ๋๋ฌธ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด ์ด๋ ต์ง ์๊ฒ ์ ๋ ฌ ๊ตฌํ์ ๋ํด์ ์ดํดํ ์ ์์๊ฒ์ด๋ผ ์๊ฐ๋๋ค.
๋ค์์ ์๋ฃํ์ ๋ฐ๋ฅธ ์ฌํํ ๋ฐ์ดํฐ ์ ๋ ฌ ์์ ๋ฅผ ์ดํด๊ฒ ๋ค.
/**
* @author CodeVillains
* @description : Comparator ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ ๋ ฌ ๊ตฌํ
*/
package com.codevillains.collection.sort;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class TestMap {
private static final Logger logger = LoggerFactory.getLogger(TestMap.class);
public static void main(String[] args) {
Map<String, String> addr = new HashMap<String, String>();
addr.put("๊ฐ๊ฐ๊ฐ1", "1");
addr.put("๋๋๋2", "1");
addr.put("๊ฐ๊ฐ๊ฐ1", "1");
addr.put("๋ค๋ค๋ค0", "1");
logger.info("#Map ์ ๋ด๊ธด ์๋ฃ : {}", addr);
Set<String> set = addr.keySet();
Object[] hmKeys = set.toArray();
Arrays.sort(hmKeys, nameSorter); // ์ด๋ฆ์ ์ ๋ ฌํ๊ธฐ
for (int i = 0; i < hmKeys.length; i++) {
String key = (String) hmKeys[i];
logger.info("# key = {}", key);
}
}
public static Comparator<Object> nameSorter = (s1, s2) -> {
String ss1 = (String) s1;
String ss2 = (String) s2;
return (-1) * ss2.compareTo(ss1);
};
}
ํค์ ๋ค์์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด nameSorter๋ฅผ ํตํด Comparator์ compareTo๋ฅผ ์ ์ฉํ์๋ค.
๊ฒฐ๊ณผํ๋ฉด์ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
INFO TestMap:24 - # Map ์ ๋ด๊ธด ์๋ฃ : {๋๋๋2=1, ๋ค๋ค๋ค0=1, ๊ฐ๊ฐ๊ฐ1=1}
INFO TestMap:32 - # key = ๊ฐ๊ฐ๊ฐ1
INFO TestMap:32 - # key = ๋๋๋2
INFO TestMap:32 - # key = ๋ค๋ค๋ค0
์ด์ฒ๋ผ map์ผ๋ก key์ ๋ณด ์ ๋ ฌํด์ ๊ฐ์ ธ์ค๋๊ฒ๋ ์ด๋ ต์ง ์๊ฒ ํ์ฉํ ์ ์๋ค.
ํน์ ๊ธฐ์ค์ ์ํ Sort๋ Collection.sort ๋ฅผ ์ฐ๋ , Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ด๋ ๋น๊ต์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋ ์ปฌ๋ผ ์ด์์ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ์ ๋ ฌ ํด์ผ ํ ๊ฒฝ์ฐ(์๋ฅผ ๋ค์ด, ์ํ ์๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ต์ ์ฌ์ด์ฆ ๋ณ๋ก ์ถ๋ ฅํด์ผ ํ๋ค๊ฑฐ๋) ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์์ ๋ฅผ ํตํด์ ํ์ธํด๋ณด๋๋ก ํ๋ค.
/**
* @author CodeVillains
*/
package com.codevillains.collection.sort;
public class Product {
public Product(String prdId, Integer prdSize) {
this.prdId = prdId;
this.prdSize = prdSize;
}
private String prdId;
private Integer prdSize;
public String getPrdId() {
return prdId;
}
public void setPrdId(String prdId) {
this.prdId = prdId;
}
public Integer getPrdSize() {
return prdSize;
}
public void setPrdSize(Integer prdSize) {
this.prdSize = prdSize;
}
}
๊ฐ๋จํ๊ฒ ์ํ์ ์ฝ๋์ ์ํ ์ฌ์ด์ฆ๋ฅผ ์ ์ธํ์๋ค.
์ ์ฅ๋ ๋ฐ์ดํฐ์ค ์ํ๋ณ, ์ํ์ ์ฌ์ด์ฆ ์์ผ๋ก ์ถ๋ ฅํ๊ธฐ ์ํด์๋ org.apache.commons.collections.comparator (์ํ์น commons-collections ์ฌ์ฉ) ๋ฅผ ์ด์ฉํ์ฌ multi ์ปฌ๋ผ์ ๋ํ ComparatorChain ์ ์ค์ ํ๋ฉด ๋๋ค.
์๋๋ ์ค์ ์ํ์ ์ฝ๋ ๊ธฐ์ค์ผ๋ก ์ฌ์ด์ฆ ์ ์ ๋ ฌ์ ๊ตฌํํ ์ฝ๋์ด๋ค.
/**
* @author CodeVillains
* @description : ์ํ์ ์ฝ๋ ๊ธฐ์ค์ผ๋ก ์ฌ์ด์ฆ ๋ณ ์ ๋ ฌ
*/
package com.codevillains.collection.sort;
import org.apache.commons.collections4.comparators.ComparatorChain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComplexSort {
private static final Logger logger = LoggerFactory.getLogger(ComplexSort.class);
private static List<Product> products = new ArrayList<>();
public static void main(String args[]) {
prepareData();
ComparatorChain chain = new ComparatorChain();
//๋น๊ตํ ๋์์ ๊ฐ Comparator๋ก ์์ฑ
chain.addComparator(comparatorPrdId); // ์ํ์์ด๋ ์ ๋ ฌ
chain.addComparator(comparatorPrdSize); // ์ํ์ฌ์ด์ฆ ์ ๋ ฌ
Collections.sort(products, chain);
consoleLog();
}
/**
* ์ํ ์์ด๋๋ฅผ ์ ๋ ฌํ๋ค.
*/
public static Comparator<Product> comparatorPrdId = (o1, o2) ->
o1.getPrdId().compareToIgnoreCase(o2.getPrdId());
/**
* ์ํ์ ์ฌ์ด์ฆ๋ฅผ ์ ๋ ฌํ๋ค.
*/
public static Comparator<Product> comparatorPrdSize = Comparator.comparing(Product::getPrdSize);
/**
* ๋์ ๊ฐ์ฒด์ ์ถ๋ ฅ ๊ธฐ๋ฅ
*/
private static void consoleLog() {
logger.info("########## ์ถ๋ ฅ ์์ #########");
for (Product product : products) {
logger.info("Print : {} = {}", product.getPrdId(), product.getPrdSize());
}
}
/**
* ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์์ฑํจ
*/
private static void prepareData() {
products.add(new Product("tshirt", 110));
products.add(new Product("tshirt", 90));
products.add(new Product("tshirt", 100));
products.add(new Product("tshirt", 95));
products.add(new Product("tshirt", 105));
products.add(new Product("shoes", 270));
products.add(new Product("shoes", 260));
products.add(new Product("shoes", 275));
products.add(new Product("clothes", 44));
products.add(new Product("clothes", 55));
products.add(new Product("clothes", 66));
}
}
ArrayList ํ์ ์ Product ๋ DB์์ ๊บผ๋ด์จ ๊ฒ์ผ๋ผ๊ณ ๊ฐ์ ํ๋ค. ์ค์ ๋ฐ์ดํฐ๋ prepareData ๋ฉ์๋์์ ์ค๋นํด๋๊ณ ๊ฐ ํญ๋ชฉ(์ํ๋ช , ์ํ์ ์ฌ์ด์ฆ) ์ ๊ธฐ์ค๋ณ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ๋ ๋ฐฉ์์ด๋ค.
prepareData()๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ํ ํ ํ ComparatorChain์ addComparator์ Comparator ํ ๋์ ์ปฌ๋ผ์ ์ง์ ํด์ค๋ค.
ComparatorChain์ ์ํ์น commons์ collections4 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํ๋ค. ๋ฐ๋ผ์ build.gradle์ ์๋์ ๊ฐ์ด ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
implementation group: 'org.apache.commons', name: 'commons-collections4', version: '4.0'
ํ์ฌ ์์ค์์๋ ์ํ๋ช ๊ณผ ์ํ๋ช ์ ํด๋นํ๋ ๊ฐ ์ฌ์ด์ฆ๋ค์ ์ ๋ ฌํ๊ธฐ ์ํด์ compare๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ prdId ์ prdSize๋ฅผ ๋น๊ตํ๋๋ก ํ์๋ค.
๊ทธ ์ญํ ์ comparatorPrdId ์ comparatorPrdSize๋ฅผ ํตํด์ ๊ตฌํ๋์ด ์๋ค.
๋๋ค ํ๊ธฐํํ๋ก ๋์ด์์ง๋ง ํด๋น ์ฝ๋๋ฅผ Compare ๋ฉ์๋๋ก Override ํด์ ๊ตฌํํด ๋ณธ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
public static Comparator<Product> comparatorPrdId = new Comparator<Product>() {
@Override
public int compare(Product o1, Product o2) {
return o1.getPrdId().compareToIgnoreCase(o2.getPrdId());
}
};
public static Comparator<Product> comparatorPrdSize = new Comparator<Product>() {
@Override
public int compare(Product o1, Product o2) {
return o1.getPrdSize().compareTo(o2.getPrdSize());
}
};
compareTo๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ ๋ฆฌํดํ๋๊ฒ์ ์์์ ์ด๋ฏธ ์ค๋ช ์ ํ์๋ค.
์ต์ข ์ ์ผ๋ก Collections.sort(list, chain);์ ํตํด ๋์ ์๋ฃ๋ฅผ ์ ๋ ฌํ ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ์๋ค.
########## ์ถ๋ ฅ ์์ #########
Print : clothes = 44
Print : clothes = 55
Print : clothes = 66
Print : shoes = 260
Print : shoes = 270
Print : shoes = 275
Print : tshirt = 90
Print : tshirt = 95
Print : tshirt = 100
Print : tshirt = 105
Print : tshirt = 110
๊ฐ ํญ๋ชฉ๊ธฐ์ค์ผ๋ก (์ํ๋ช ) ์ฌ์ด์ฆ ์์๋๋ก ์ ์์ ์ธ ์ ๋ ฌ์ด ์๋ฃ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค.
์ ์ฒด ์์ ์์ค๋ ์๋์ Git์ collections Repository์์ ํ์ธ ํ ์ ์๋ค.
https://github.com/villainscode/collections
๊ณผ๊ฑฐ ์ ๋ฌด ์งํ์ค์ ์ ๋ ฌ ์กฐ๊ฑด์ด ํ๊ธ์, ์๋ฌธ์, ์ซ์์ (๊ฐ๋๋ค, abc, 123)์ผ๋ก ์ ๋ ฌ์ ํ์ฌ ํ์ด์ง์ ํด๋ฌ๋ผ๋ ์๊ตฌ๋ฅผ ๋ฐ์ ์ ์ด ์๋ค.
๊ฐ๊ฐ์ ๋ฐ๋ผ๋ด์ ์ ๋ ฌํ ํ ๋จธ์งํ๊ณ ํ์ด์ง์ ํ๊ฑฐ๋ ๋น๊ตํจ์๋ฅผ ํตํด ๊ฐ ์บ๋ฆญํฐ์ ์ ๋ ฌ ๋ก์ง์ ๋ง๋ค๊ฑฐ๋ ํด์ผ ํ ๊ฒ์ผ๋ก ํ๋จํ๋๋ฐ ๋คํํ ์ด๋ฏธ ๊นํ๋ธ์ ๊ตฌํํ ๋ก์ง์ด ์์ด์ ์ฐธ๊ณ ํ ์ ์์๋ค.
/**
* @author CodeVillains
* @description : ํ๊ธ > ์์ด > ์ซ์ > ํน์๋ฌธ์ ์์๋ก ์ ๋ ฌ
*/
// Sort ๋ฉ์๋ (Collections.sort() ๋ฅผ ์ด์ฉํ๋, ํ๊ธ, ์๋ฌธ, ์ซ์ ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด
// OrderingByKoreanEnglishNumbuerSpecial ์์ ์ ๋ ฌ์ ๊ตฌํํ๋ค.
private void sortByName(List<Partner> results) {
// ๊ฐ๋๋ค abc 123 ์์ผ๋ก ์ ๋ ฌ
Collections.sort(results, new Comparator<Partner>() {
@Override
public int compare(Partner left, Partner right) {
return OrderingByKoreanEnglishNumbuerSpecial.compare(left.getName(), right.getName());
}
});
}
/**
* @author CodeVillains
* @description : ํ๊ธ > ์์ด > ์ซ์ > ํน์๋ฌธ์ ์์๋ก ์ ๋ ฌ
*/
import org.apache.commons.lang3.StringUtils;
public class OrderingByKoreanEnglishNumbuerSpecial {
private static final int REVERSE = -1;
private static final int LEFT_FIRST = -1;
private static final int RIGHT_FIRST = 1;
/**
* ํ๊ธ > ์์ด > ์ซ์ > ํน์๋ฌธ์ ์์ ๋น๊ต ํจ์
* @param left
* @param right
* @return int
*/
public static int compare(String left, String right) {
left = StringUtils.upperCase(left).replaceAll(" ", "");
right = StringUtils.upperCase(right).replaceAll(" ", "");
int leftLen = left.length();
int rightLen = right.length();
int minLen = Math.min(leftLen, rightLen);
for (int i = 0; i < minLen; ++i) {
char leftChar = left.charAt(i);
char rightChar = right.charAt(i);
if (leftChar != rightChar) {
if (isKoreanAndEnglish(leftChar, rightChar) || isKoreanAndNumber(leftChar, rightChar) || isEnglishAndNumber(leftChar, rightChar) || isKoreanAndSpecial(leftChar, rightChar)) {
return (leftChar - rightChar) * REVERSE;
} else if (isEnglishAndSpecial(leftChar, rightChar) || isNumberAndSpecial(leftChar, rightChar)) {
if (CharUtil.isEnglish(leftChar) || CharUtil.isNumber(leftChar)) {
return LEFT_FIRST;
} else {
return RIGHT_FIRST;
}
} else {
return leftChar - rightChar;
}
}
}
return leftLen - rightLen;
}
private static boolean isKoreanAndEnglish(char ch1, char ch2) {
return (CharUtil.isEnglish(ch1) && CharUtil.isKorean(ch2)) || (CharUtil.isKorean(ch1) && CharUtil.isEnglish(ch2));
}
private static boolean isKoreanAndNumber(char ch1, char ch2) {
return (CharUtil.isNumber(ch1) && CharUtil.isKorean(ch2)) || (CharUtil.isKorean(ch1) && CharUtil.isNumber(ch2));
}
private static boolean isEnglishAndNumber(char ch1, char ch2) {
return (CharUtil.isNumber(ch1) && CharUtil.isEnglish(ch2)) || (CharUtil.isEnglish(ch1) && CharUtil.isNumber(ch2));
}
private static boolean isKoreanAndSpecial(char ch1, char ch2) {
return (CharUtil.isKorean(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isKorean(ch2));
}
private static boolean isEnglishAndSpecial(char ch1, char ch2) {
return (CharUtil.isEnglish(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isEnglish(ch2));
}
private static boolean isNumberAndSpecial(char ch1, char ch2) {
return (CharUtil.isNumber(ch1) && CharUtil.isSpecial(ch2)) || (CharUtil.isSpecial(ch1) && CharUtil.isNumber(ch2));
}
}
/**
* @author CodeVillains
*/
public class CharUtil {
public static boolean isEnglish(char ch) {
return (ch >= (int) 'A' && ch <= (int) 'Z') || (ch >= (int) 'a' && ch <= (int) 'z');
}
public static boolean isKorean(char ch) {
return ch >= Integer.parseInt("AC00", 16) && ch <= Integer.parseInt("D7A3", 16);
}
public static boolean isNumber(char ch) {
return ch >= (int) '0' && ch <= (int) '9';
}
public static boolean isSpecial(char ch) {
return (ch >= (int) '!' && ch <= (int) '/')
|| (ch >= (int)':' && ch <= (int)'@')
|| (ch >= (int)'[' && ch <= (int)'`')
|| (ch >= (int)'{' && ch <= (int)'~');
}
}