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()) + " ");
	}
}

좋은 웹페이지 즐겨찾기