quilt code
[고급자바] 컬렉션 프레임워크 (2) 본문
1. ListSort
| List만들기 |
|
List<Member> memList = new ArrayList<>();
memList.add(new Member(1,"홍길동","010-1111-1111")); memList.add(new Member(5,"변학도","010-2222-2222")); memList.add(new Member(9,"성춘향","010-3333-3333")); memList.add(new Member(3,"이순신","010-4444-4444")); memList.add(new Member(6,"강감찬","010-5555-5555")); memList.add(new Member(2,"정재현","010-6666-6666")); |
| 1) 오름차순 정렬 향상된 for문 이용 |
|
System.out.println("정렬 전...");
for(Member mem : memList) { System.out.println(mem); } |
|
정렬 전...
Member [num=1, name=홍길동, tel=010-1111-1111] Member [num=5, name=변학도, tel=010-2222-2222] Member [num=9, name=성춘향, tel=010-3333-3333] Member [num=3, name=이순신, tel=010-4444-4444] Member [num=6, name=강감찬, tel=010-5555-5555] Member [num=2, name=정재현, tel=010-6666-6666] |
| Collection |
|
Collections.sort(memList);
|
| 오름차순 정렬 |
|
System.out.println("이름의 오름차순으로 정렬 후...");
for(Member mem : memList) { System.out.println(mem); } |
|
이름의 오름차순으로 정렬 후...
Member [num=6, name=강감찬, tel=010-5555-5555] Member [num=5, name=변학도, tel=010-2222-2222] Member [num=9, name=성춘향, tel=010-3333-3333] Member [num=3, name=이순신, tel=010-4444-4444] Member [num=2, name=정재현, tel=010-6666-6666] Member [num=1, name=홍길동, tel=010-1111-1111] |
| 2) 내림차순 정렬 |
|
System.out.println("이름의 내림차순으로 정렬 후...");
for (Member mem : memList) { System.out.println(mem); } |
| shuffle로 섞기 |
|
Collections.shuffle(memList);
|
| 향상된 for문 |
|
System.out.println("섞은 후...");
for (Member mem : memList) { System.out.println(mem); } |
|
섞은 후...
Member [num=9, name=성춘향, tel=010-3333-3333] Member [num=1, name=홍길동, tel=010-1111-1111] Member [num=6, name=강감찬, tel=010-5555-5555] Member [num=2, name=정재현, tel=010-6666-6666] Member [num=5, name=변학도, tel=010-2222-2222] Member [num=3, name=이순신, tel=010-4444-4444] |
|
Collections.sort(memList, new SortNumDesc());
|
|
System.out.println("외부 정렬자를 이용한 정렬 후...");
for (Member mem : memList) { System.out.println(mem); |
|
외부 정렬자를 이용한 정렬 후...
Member [num=9, name=성춘향, tel=010-3333-3333] Member [num=6, name=강감찬, tel=010-5555-5555] Member [num=5, name=변학도, tel=010-2222-2222] Member [num=3, name=이순신, tel=010-4444-4444] Member [num=2, name=정재현, tel=010-6666-6666] Member [num=1, name=홍길동, tel=010-1111-1111] |
2. Comparator 인터페이스
| 1. 외부정렬자를 생성하기 위해서 Comparator 인터페이스를 구현한다 (Member 번호의 내림차순으로 정렬하기) |
| 1)
if(mem1.getNum() > mem2.getNum()) {
return -1; } else if(mem1.getNum()==mem2.getNum()) { return 0; } else { return 1; } |
| 2) return new Integer(mem1.getNum()).compareTo(mem2.getNum())*-1;
|
| 3) return Integer.compare(mem1.getNum(), mem2.getNum())*-1; *-1 내림차순
|
| 2. 회원의 정보를 저장할 클래스 생성하기 회원정보는 회원번호(int), 회원이름, 전화번호로 되어 있음 회원이름을 기준으로 오름차순 정렬이 될 수 있는 클래스 생성하기 |
|
class Member implements Comparable<Member>{
private int num; private String name; private String tel; public Member(int num, String name, String tel) {
super(); this.num = num; this.name = name; this.tel = tel; } @Override
public String toString() { return "Member [num=" + num + ", name=" + name + ", tel=" + tel + "]"; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } @Override public int compareTo(Member mem) { return name.compareTo(mem.getName()); //this는 생략가능 } } |
2. HashSet
| 1. Set에 데이터를 추가할 때도 add() 이용 |
|
Set hs1 = new HashSet();
hs1.add("DD");
hs1.add("AA"); hs1.add(2); hs1.add("CC"); hs1.add("BB"); hs1.add(1); hs1.add(3); System.out.println("Set 데이터 : " + hs1);
System.out.println(); |
|
Set 데이터 : [DD, AA, CC, BB, 1, 2, 3]
|
| 2. Set은 데이터의 순서(인덱스를 통한 접근)가 없고, 중복을 허용하지 않는다. 그래서 이미 있는 데이터를 add 하면 false를 반환하고, 데이터는 추가되지 않는다. |
|
boolean isAdded = hs1.add("FF");
System.out.println("중복되지 않을때 : " + isAdded); System.out.println("Set 데이터 : " + hs1); System.out.println(); isAdded = hs1.add("CC");
System.out.println("중복되지 않을때 : " + isAdded); System.out.println("Set 데이터 : " + hs1); System.out.println(); |
| 중복되지 않을때 : true Set 데이터 : [DD, AA, CC, BB, FF, 1, 2, 3] 중복되지 않을때 : false
Set 데이터 : [DD, AA, CC, BB, FF, 1, 2, 3] |
| 3. Set의 데이터를 수정하려면 수정하는 메소드가 따로 없기 때문에 해당 자료를 삭제한 후 새로운 데이터를 추가해줘야 한다. 삭제하는 메소드 1) clear( ) => Set 데이터 전체 삭제 2) remove(삭제할 자료) => 해당 자료 삭제 ex) 'FF'를 'EE'로 수정하기 |
|
hs1.remove("FF");
System.out.println("FF 삭제 후 Set 데이터 : " + hs1); System.out.println(); hs1.add("EE"); System.out.println("EE 추가 후 Set 데이터 : " + hs1); System.out.println(); |
|
FF 삭제 후 Set 데이터 : [DD, AA, CC, BB, 1, 2, 3]
EE 추가 후 Set 데이터 : [DD, AA, CC, BB, EE, 1, 2, 3] |
| 4. hs1.clear(); 전체자료 삭제 |
|
hs1.clear(); // 전체자료 삭제
System.out.println("clear 후 Set 데이터 : " + hs1); System.out.println("Set의 데이터 개수 : " + hs1.size()); System.out.println(); |
|
clear 후 Set 데이터 : []
Set의 데이터 개수 : 0 |
| 5. Set은 데이터의 인덱스가 없기 때문에 List처럼 인덱스로 데이터를 하나씩 불러올 수 없다. 그래서 데이터를 하나씩 얻기 위해서는 Interator를 이용하여 접근한다. |
|
Iterator it = hs1.iterator();
|
| 6. 데이터 갯수만큼 반복하기 : hasNext() => 포인터 다음 위치에 있는 데이터가 있으면 true, 없으면 false를 반환함 |
| while(it.hasNext()) { //next() => 포인터를 다음 데이터로 이동시키고 이동한 위치의 데이터를 반환한다. System.out.println(it.next());
} |
| 7. 1~100 사이의 중복되지 않는 정수 5개 만들기 |
|
Set<Integer> intRnd = new HashSet<>();
while(intRnd.size() < 5) { int num = (int) (Math.random()*100 + 1); intRnd.add(num); //추가하기 } System.out.println("만들어진 난수들 : " + intRnd);
|
|
만들어진 난수들 : [48, 83, 20, 6, 10]
|
| 8. Collection 타입의 객체들은 서로 다른 자료 구조로 쉽게 변경해서 사용할 수 있다. 다른 종류의 객체를 생성할 때 생성자에 변경할 데이터를 넣어주면 된다. |
|
List<Integer> intRndList = new ArrayList(intRnd);
System.out.println("List의 자료 출력 ..."); for(int i=0; i<intRndList.size(); i++) { System.out.println(intRndList.get(i)); } } |
3. TreeSet
| 1. TreeSet은 자동정렬 기능이 들어가 있다 |
|
TreeSet<String> ts = new TreeSet<>();
List<String> abcList = new ArrayList<>(); |
| 2. 영어 대문자를 문자열로 변환하여 List에 저장하기 |
|
for(char ch='A'; ch<='Z'; ch++) {
String temp = String.valueOf(ch); abcList.add(temp); } Collections.shuffle(abcList); System.out.println("섞은 후 abcList : " + abcList); for(String str : abcList) { ts.add(str); } System.out.println("TreeSet 데이터 : " + ts); |
|
섞은 후 abcList : [E, N, U, T, O, Z, C, Q, H, F, G, B, S, I, X, J, Y, M, V, P, K, R, L, D, W, A]
TreeSet 데이터 : [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z] |
| 3. TreeSet에 저장된 자료 중 특정한 자료보다 작은 자료를 찾아서 SortedSet으로 반환하는 메소드가 있다. => headSet(기준값) : 기본적으로 '기준값'은 포함시키지 않는다. => headSet(기준값, 논리값) : 논리값이 'true'이면 '기준값' 포함시킨다. |
|
SortedSet<String> ss1 = ts.headSet("K");
System.out.println("K 이전 자료 : " + ss1); System.out.println("K 이전 자료(기준값 포함) : " + ts.headSet("K",true)); |
|
K 이전 자료 : [A, B, C, D, E, F, G, H, I, J]
K 이전 자료(기준값 포함) : [A, B, C, D, E, F, G, H, I, J, K] |
| 4. '기준값'보다 큰 자료를 찾아 SortedSet으로 반환하는 메소드 => tailSet(기준값) : 기본적으로 '기준값'을 포함시킨다. => tailSet(기준값, 논리값) : 논리값이 'false'이면 '기준값' 미포함 |
|
SortedSet<String> ss2 = ts.tailSet("K");
System.out.println("K 이후 자료 : " + ss2); System.out.println("K 이후 자료(기준값 미포함) : " + ts.tailSet("K", false)); |
|
K 이후 자료 : [K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
K 이후 자료(기준값 미포함) : [L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z] |
| 5. subSet(기준값1, 기준값2) : 기준값1 ~ 기준값2 사이의 값을 가져온다. ('기준값1' 포함, '기준값2' 미포함) subSet(기준값1, 논리값1, 기준값2, 논리값2) : 각 '기준값'을 포함할지 여부를 결정한다. ('논리값'이 true이면 포함, false이면 미포함) |
|
System.out.println("K(포함)부터 N(미포함)까지 : " + ts.subSet("K", "N"));
System.out.println("K(포함)부터 N(미포함)까지 : " + ts.subSet("K", true, "N", true)); System.out.println("K(미포함)부터 N(포함)까지 : " + ts.subSet("K", false, "N", false)); System.out.println("K(미포함)부터 N(포함)까지 : " + ts.subSet("K", false, "N", true)); |
|
K(포함)부터 N(미포함)까지 : [K, L, M]
K(포함)부터 N(미포함)까지 : [K, L, M, N] K(미포함)부터 N(포함)까지 : [L, M] K(미포함)부터 N(포함)까지 : [L, M, N] |
'daily > 고급자바' 카테고리의 다른 글
| [고급자바] 컬렉션 프레임워크(4) (0) | 2023.02.02 |
|---|---|
| [고급자바] Student 과제 (0) | 2023.02.02 |
| [고급자바] Lotto 과제 (0) | 2023.02.02 |
| [고급자바] 컬렉션 프레임워크 (3) (0) | 2023.02.01 |
| [고급자바] 컬렉션 프레임워크 (1) (0) | 2023.01.30 |