quilt code

[고급자바] 컬렉션 프레임워크 (2) 본문

daily/고급자바

[고급자바] 컬렉션 프레임워크 (2)

김뱅쇼 2023. 1. 31. 19:31

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]