가자미의 개발이야기
자바 컬렉션 프레임워크 Set<E> : HashSet, TreeSet 본문
a. Set<E>
중복 안되고 순서가 없는 집합 개념
메소드는 Collection 메소드와 동일
b. HashSet
순서 상관x, 중복 허용 안됨
중복요소 제거하고 싶으면 HashSet
순서를 유지하고 싶으면 LinkedHashSet
#생성자
HashSet() | 해쉬셋 객체생성 |
HashSet(Collection c) | 주어진 컬렉션을 포함하는 해쉬셋 객체생성 |
HashSet(int initialCapacity) | 초기 용량을 가진 해쉬셋을 생성 |
HashSet(int initialCapacity, float loadFactor) | 초기 용량과 load factor를 지정하는 생성자 |
메소드는 Collection 메소드와 거의 동일
--Set<E>를 구현하는 HashSet<E>클래스의 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class SetPractice {
public static void main(String[] args) {
Set<String> set=new HashSet<>();
set.add("Toy"); set.add("Box");
set.add("Robot");
System.out.println("인스턴스 수 :"+set.size());
//반복자를 이용한 전체 출력
for(Iterator<String> itr=set.iterator();itr.hasNext();) {
System.out.print(itr.next()+'\t');
}
System.out.println();
//for-each문을 이용한 전체 출력
for(String s : set) {
System.out.print(s+'\t');
}
System.out.println();
}
}
|
HashSet으로 중복된 요소 제거하기
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class Num {
public static void main(String[] args) {
List<String> lst = Arrays.asList("BOX", "TOY","BOX","TOY");
ArrayList<String> list=new ArrayList<>(lst);
for(String s: list) {
System.out.print(s.toString()+'\t');
}
System.out.println();
//중복된 인스턴스 제거
HashSet<String> set = new HashSet<>(list);
//원래대로 ArrayList인스턴스로 저장물을 옮긴다.
list= new ArrayList<>(set);
for (String s :list) {
System.out.print(s+'\t');
}
}
}
해쉬에서 동일 인스턴스의 기준은?
--public int hashCode(); 이 메소드는 해쉬의 분류 기준을 확정하고 분류결과가 일치하고
--equals메소드의 결과가 true이면 동일 인스턴스로 취급!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Num {
private int num;
public Num(int n) {num=n;}
@Override
public String toString() {return String.valueOf(num);}
@Override
public int hashCode() {
return num %3;//num의 갑싱 같으면 부류도 같다.
}
@Override
public boolean equals(Object obj) {
if(num==((Num)obj).num)
return true;
else
return false;
}
}
|
-해쉬 알고리즘 일일히 정의하기 싫다면...
--public static int hash(object,..., values) ->java.util.Objects에 정의된 메소드. 전달된 인자 기반 해쉬값 반환
--오버라이딩해서 사용
c. TreeSet<E>
이진 검색 트리 형태로 데이터 저장.
-트리 기반으로 인스턴스 저장. 정렬상태가 유지되면서 인스턴스 저장됨
#생성자
TreeSet() | 기본 생성자 |
TreeSet(Collection c) | 주어진 컬렉션을 저장하는 트리셋 생성 |
TreeSet(Comparator comp) | 주어진 정렬 조건으로 정렬하는 트리셋 생성 |
TreeSet(SortedSet s) | SortedsSet를 구현한 커렉션 s를 저장하는 TreeSet 생성 |
#메서드 Collection 메소드는 비슷
메서드 | 내용 |
Object ceiling(Object o) | 지정한 객체와 같은 객체가 있으면 반환, 없으면 큰 값을 가진 객체 중에 제일 가까운 값에 객체를 반환. 없으면 null |
Comparator comparator() | 트리셋의 정렬기준을 반환 |
Object first() | 첫 객체를 반환 |
Object floor(Object o) | 지정한 객체와 같은 객체가 있으면 반환, 없으면 작은 값을 가진 객체 중에 제일 가까운 값에 객체를 반환. 없으면 null |
SortedSet headSet(Object toElement) | 지정된 객체보다 작은 값의 객체들을 반환 |
SortedSet tailSet(Object fromElement) | 지정된 객체보다 큰 값의 객체들을 반환 |
SortedSet subSet(Object from, Object to) | from 객체부터 to 전 객체까지 반환 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.util.TreeSet;
import java.util.Set;
import java.util.Iterator;
public class Num {
public static void main(String[] args) {
TreeSet<Integer> tree = new TreeSet<Integer>();
tree.add(3); tree.add(1); tree.add(2); tree.add(4);
System.out.println("인스턴스 수: "+ tree.size());
for(Integer n : tree) {
System.out.print(n.toString()+'\t');
}
System.out.println();
for(Iterator<Integer> itr=tree.iterator();itr.hasNext();)
System.out.print(itr.next().toString()+'\t');
System.out.println();
}
}
|
TreeSet<E> 클래스의 오름차순 출력?
-interface Comparable<T>의 int compareTo(T o)의 구현.
public interface Comparator<T>의 int compare(T o1, T o2)의 구현 *이 방법은 어떤 클래스의 compareTo메소드 구현이 마음에 안들고 새로운 방식으로 정렬하고 싶을 때 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.util.Comparator;
import java.util.TreeSet;
class PersonComparator implements Comparator<Person>{
public int compare(Person p1, Person p2) {
return p2.age-p1.age;
}
}
public class Person implements Comparable<Person>{
String name;
int age;
public Person(String nme, int ag) {
this.age=ag; this.name=nme;
}
@Override
public int compareTo(Person p) {
return this.age-p.age;
}
@Override
public String toString() {
return this.name+this.age;
}
public static void main(String[] args) {
TreeSet<Person> tree = new TreeSet<>(new PersonComparator());
tree.add(new Person("Yoon", 37));
tree.add(new Person("Hong", 53));
tree.add(new Person("Park", 22));
for(Person p : tree) {
System.out.println(p);
}
}
}
|
'Java > 자바 기본 문법' 카테고리의 다른 글
자바 컬렉션 기반 알고리즘 (0) | 2021.02.03 |
---|---|
자바 컬렉션 프레임워크 Map<K,V> : HashMap (0) | 2021.02.02 |
자바 컬렉션 프레임워크-List<E> : ArrayList, LinkedList, Stack, Queue (0) | 2021.02.02 |
[Java] 자바 와일드카드 (0) | 2021.01.22 |
[Java] 자바 제네릭의 상속과 타겟타입 (0) | 2021.01.22 |