Collections - Tree
treeSet
package ex05.collections.tree16;
import java.util.Iterator;
import java.util.TreeSet;
/*
TreeSet : Data -> Tree 자료구조를 사용 -> 내부적으로 정렬 : Data로 Data를 검색
Data의 중복을 허용하지 않는다
TreeMap : Key, Value -> Tree 자료구조를 사용 Key를 내부적으로 정렬 : Key에 의해 Data를 검색
Key의 중복을 허용하지 않는다
공통점 : Tree 자료구조를 사용
*/
public class TreeEx {
public static void main(String[] args) {
TreeSet<Integer> sTree = new TreeSet<Integer>();
sTree.add(1);
sTree.add(2);
sTree.add(4);
sTree.add(3);
sTree.add(2);
// 중복을 허용하지 않으므로 4가 나온다
System.out.println("데이터 수 : " + sTree.size());
// 전체 출력해보면 <오름차순> 정렬 상태로 출력된다
Iterator<Integer> itr = sTree.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
}
Tree 컬렉션에 객체 저장시 반드시 compareTo() 메서드를 구현해야 한다.
compareTo() - 현재객체보다 더 작은 것 --> 음수 리턴 = 오름차순에서 작은것이 앞부터 정렬
package ex05.collections.tree17;
import java.util.Iterator;
import java.util.TreeSet;
//Tree 컬렉션을 사용하는 클래스는 반드시 Comparable 인터페이스를 구현해야 한다.
//Comparable 인터페이스에 의해 구현되는 메서드는 <정렬기준>을 Tree 컬렉션에 제공한다.
class Person implements Comparable<Person>{
private String name;
private int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name+":"+age;
}
@Override
public int compareTo(Person o) { //이 메서드를 반드시 구현.
if(this.age > o.age)
return 1;
else if (this.age < o.age)
return -1;
else
return 0; //나이가 같다
}
}
public class ComparablePerson {
public static void main(String[] args) {
TreeSet<Person> sTree = new TreeSet<Person>();
sTree.add(new Person("홍길동",24));
sTree.add(new Person("임꺽정",33));
sTree.add(new Person("장길산",19));
sTree.add(new Person("일지매",19)); //같으면 없애버린다.
Iterator<Person> itr = sTree.iterator();
while(itr.hasNext()) { //itr = 배열처럼 자료구조에서 순서대로 접근
Person p = itr.next();
System.out.println(p);
}
}
}
package ex05.collections.tree17;
import java.util.Iterator;
import java.util.TreeSet;
class MyString implements Comparable<MyString>{
private String str;
MyString(String str){
this.str = str;
}
int getLength() {
return str.length();
}
@Override
public int compareTo(MyString o) {
if(this.getLength() > o.getLength())
return 1;
else if(this.getLength() < o.getLength())
return -1; //더 작은 것(오름차순에서 앞에 오려면) 음수로
else
return 0;
}
@Override
public String toString() {
return str;
}
}
public class ComparableString {
public static void main(String[] args) {
TreeSet<MyString> sTree = new TreeSet<MyString>();
sTree.add(new MyString("Orange"));
sTree.add(new MyString("Apple"));
sTree.add(new MyString("Dog"));
sTree.add(new MyString("Indivisual"));
sTree.add(new MyString("cat")); //dog과 길이가 같기 때문에 중복 -> 지워버린다.
Iterator<MyString> itr = sTree.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
}
package ex05.collections.tree17;
import java.util.Iterator;
import java.util.TreeSet;
class MyString implements Comparable<MyString>{
private String str;
MyString(String str){
this.str = str;
}
int getLength() {
return str.length();
}
@Override
public int compareTo(MyString o) {
// return str.compareTo(o.str); //알파벳순으로
return -str.compareTo(o.str); //알파벳 역순으로
}
@Override
public String toString() {
return str;
}
}
public class ComparableString {
public static void main(String[] args) {
TreeSet<MyString> sTree = new TreeSet<MyString>();
sTree.add(new MyString("Orange"));
sTree.add(new MyString("Apple"));
sTree.add(new MyString("Dog"));
sTree.add(new MyString("Indivisual"));
sTree.add(new MyString("Cat")); //알파벳 순이므로 출력된다.
Iterator<MyString> itr = sTree.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
}
Comparater
: 기존은 알파벳 순인데 다른 비교기준을 주고싶어 사용
package ex05.collections.tree21;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class MyString implements Comparable<MyString>{
private String str;
private int age;
MyString(String str, int age){
this.str = str;
this.age = age;
}
int getAge() {
return age;
}
int getLength() {
return str.length();
}
@Override
public int compareTo(MyString o) { //기존 : 알파벳 기준
return str.compareTo(o.str);
}
@Override
public String toString() {
return str+":"+age;
}
}
//기존과 다른 비교기준을 제공하고 싶을 때
class AgeComparator implements Comparator<MyString>{
@Override
public int compare(MyString o1, MyString o2) {
if(o1.getAge() > o2.getAge())
return 1;
else if(o1.getAge() < o2.getAge())
return -1;
else
return 0;
}
}
public class ComparableString {
public static void main(String[] args) {
TreeSet<MyString> sTree = new TreeSet<MyString>(new AgeComparator()); //comparator 기준을 가지고 비교
sTree.add(new MyString("Orange", 1934));
sTree.add(new MyString("Apple", 1922));
sTree.add(new MyString("Dog", 1935));
sTree.add(new MyString("Individual", 1911));
sTree.add(new MyString("Cat", 1908));
Iterator<MyString> itr = sTree.iterator();
while(itr.hasNext())
System.out.println(itr.next());
}
}
treeMap
package ex05.collections.tree22;
import java.util.Iterator;
import java.util.NavigableSet;
import java.util.TreeMap;
public class TreeMapEx {
public static void main(String[] args) {
//Map은 키값으로 정렬됨
TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
tMap.put(1, "data1");
tMap.put(3, "data3");
tMap.put(5, "data5");
tMap.put(2, "data2");
tMap.put(4, "data4");
NavigableSet<Integer> navi = tMap.navigableKeySet();
System.out.println("[오름차순 정렬]");
Iterator<Integer> itr = navi.iterator();
while(itr.hasNext())
System.out.print(tMap.get(itr.next()) + " ");
System.out.println();
System.out.println("[내림차순 정렬]");
itr = navi.descendingIterator(); //뒤에서부터 접근
while(itr.hasNext())
System.out.print(tMap.get(itr.next()) + " ");
}
}
Author And Source
이 문제에 관하여(Collections - Tree), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jinkyung/Collections-Tree저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)