2018-6-6 Collection Framework TreeSet
TreeSet<E> 클래스
- TreeSet은 트리 자료구조를 기반으로 인스턴스를 저장한다. 이는 정렬된 상태가 유지되면서 인스턴스가 저장된다.
package yoon;
import java.util.Iterator;
import java.util.TreeSet;
public class SortedTreeSet {
public static void main(String[] args) {
TreeSet<Integer> tree = new TreeSet<>();
tree.add(3); tree.add(1);
tree.add(2); tree.add(4);
System.out.println("인스턴스의 수 : " + tree.size());
for(Integer num : tree)
System.out.print(num.toString() + "\t");
System.out.println();
for(Iterator<Integer> itr = tree.iterator(); itr.hasNext(); )
System.out.print(itr.next().toString() + "\t");
System.out.println();
}
}
//result
인스턴스의 수 : 4
1 2 3 4
1 2 3 4
- TreeSet은 인스턴스가 정렬 상태를 유지하면서 인스턴스를 저장하기 때문에 TreeSet<E>의 반복자는 인스턴스들의 참조 순서는 오름차순을 기준으로 한다는 특징이있다.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() { return name + " : " + age; }
}
- 위의 경우 어떻게 정렬을 하느냐가 기준이 애매해진다. 그것은 프로그래머가 결정할 일이다.
- public interface Comparable<T> : 이 인터페이스 위치한 유일한 추상 메소드 int compareTo(T o)
인스턴스의 비교 기준을 정의하는 Comparable<T> 인터페이스 구현기준
- int compareTo(T o)를 정의해야한다.
- o가 작다면 양의 정수 반환
- o가 크다면 음의 정수 반환
- o가 같다면 0을 반환
package yoon;
import java.util.TreeSet;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() { return name + " : " + age; }
@Override
public int compareTo(Person p) {
return this.age - p.age;
}
}
public class ComparablePerson {
public static void main(String[] args) {
TreeSet<Person> tree = new TreeSet<>();
tree.add(new Person("YOON", 37));
tree.add(new Person("HONG", 53));
tree.add(new Person("PARK", 22));
for(Person p : tree)
System.out.print(p + "\t");
System.out.println();
}
}
//result
PARK : 22
YOON : 37
HONG : 53
Comparator<E> 인터페이스 기반으로 TreeSet<E> 정렬기준 제시하기
package yoon;
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 ComparatorPerson {
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);
}
}
//result
HONG : 53
YOON : 37
PARK : 22
package yoon;
import java.util.Comparator;
import java.util.TreeSet;
class StringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
public class ComparatorString {
public static void main(String[] args) {
TreeSet<String> tree = new TreeSet<>(new StringComparator());
tree.add("Box");
tree.add("Rabbit");
tree.add("Robot");
for(String s : tree)
System.out.print(s.toString() + "\t");
System.out.println();
}
}
//result
Box Robot Rabbit
중복된 인스턴스를 삭제하기
- List<E>는 중복된 인스턴스를 허용한다. 하지만 이 하나만 남기고 모두 지워야 할때
package yoon;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class ConvertCollection {
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<String> 인스턴스로 옮긴다.
list = new ArrayList<>(set);
for(String s : list)
System.out.print(s.toString() + "\t");
System.out.println();
}
}
//result
Box Toy Box Toy
Box Toy
- HashSet<E> set = new HashSet<>(list); => 생성자를 통해서 컬렉션 인스턴스를 생성하는 문장이다.
- public HashSet(Collection<? extends E> c)
Written on June 6, 2018