Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

169 - Java 컬렉션(Collection) : Set - TreeSet 클래스, 자동적으로 오름차순 정렬을 실행하는 클래스이다. 중복을 허용하지 않고 순서가 없다. 본문

[Java]/Program source (java)

169 - Java 컬렉션(Collection) : Set - TreeSet 클래스, 자동적으로 오름차순 정렬을 실행하는 클래스이다. 중복을 허용하지 않고 순서가 없다.

Jelly-fish 2023. 9. 22. 17:50
/* ====================================
  ■■■ 컬렉션 (Collection) ■■■
======================================*/

// Set → HashSet, TreeSet, ...
// · 순서 없음
// · 중복 허용하지 않는 구조(기본)

/*
정렬은 부하가 많이 걸리는 작업이므로
성능이 떨어지는 클래스임을 알 수 있다.


○ TreeSet<E> 클래스

   java.util.TreeSet<E> 클래스는
   Set 인터페이스를 상속한 SortedSet 인터페이스를 구현한 클래스로
   데이터를 추가하면 데이터들이 자동으로 오름차순 정렬이 된다.
*/


// VO	- Value Ovject
// DTO	- Data Transfer Object
// DAO	- Data Access Object



// ↓ 실무에서 주로 사용하는 것
// DTO	- Data Transfer Object
// DAO	- Data Access Object

// VO DTO 비슷한 계층이다.
// 업무 로직에 따라 구분한다...
 
// VO 계층으로도 사용
// DAO

import java.util.Iterator;
import java.util.TreeSet;
import java.util.Comparator;


class GradeVO
{
	// 주요 속성 구성
	private String hak;			//-- 학번
	private String name;		//-- 이름
	private int kor, eng, mat;	//-- 국어, 영어, 수학 점수

	
	// 사용자 정의 생성자 → 5개의 매개변수를 가진 생성자
	GradeVO(String hak, String name, int kor, int eng, int mat)
	{
		this.hak = hak;
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}

	// 이와 같은 경우 default 생성자 자동 삽입되지 않음~!!!

	// 사용자 정의 생성자 → 매개변수 없는 생성자(default 생성자 형태)
	GradeVO()
	{
		// 생성자 내부에서 또다른 생성자 호출
		//GradaVO("", "", 0, 0, 0);
		// ↓ 
		this("", "", 0, 0, 0);
	
	}

	// getter / setter 구성


// [getter]===============================

	public String getHak()
	{
		return hak;
	}

	public String getName()
	{
		return name;
	}

	public int getKor()
	{
		return kor;
	}

	public int getEng()
	{
		return eng;
	}

	public int getMat()
	{
		return mat;
	}

// =======================================


// [setter]===============================

	public void setHak(String hak)
	{
		this.hak = hak;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public void setKor(int kor)
	{
		this.kor = kor;
	}

	public void setEng(int eng)
	{
		this.eng = eng;
	}

	public void setMat(int mat)
	{
		this.mat = mat;
	}
// =======================================

	public int getTot()
	{
		//return kor + eng + mat;
		return this.kor + this.eng + this.mat;
	}

	//@Override
	//public String toString()
	//{
	//	return String.format("학번 : %s  이름 : %s  ");
	//	
	//}


}

// 트리셋이라는 자료구조 자체가 내부에서 정렬을 한다 → 그것이 Compare...
// MyComparator<T> 설계중
// ★ T를 넣으면 어떤 Type을 넘겨 주면... 이라는 의미
// ★ E를 넣으면 어떤 Element를 수용하겠다라는 표현

// Compare라는 메소드를 오버라이딩 하기위해
class MyComparactor<T> implements Comparator<T> 
{
	
	// o1과 o2를 받아왔으면 뭘 반환...

	
	// 비교 메소드 재정의				// T type의 무언가가 매개변수로... 들어온다...	
	@Override							// 사용자가 설정한 타입의 변수가 메소드의 인자로...(사용자가 세팅)
	public int compare(T o1, T o2)
	{
		// 매개변수로 들어온 값들을
		// GradeVO 타입으로 변경하도록
		// 부모 클래스 Comparator의 compare() 메소드를
		// 오버라이딩 하고 있다.

		GradeVO s1 = (GradeVO)o1;
		GradeVO s2 = (GradeVO)o2;

		// compare를 통해 들어온 두 인자 o1, o2를 빼서
		// 음수가 나오면 뒤에 값 o2가 더 큰 것이고
		// 양수가 나오면 앞에 값 o1이 더 큰 것이며
		// 0이 나오면 서로 같다는 원리를 이용하여 compare() 메소드는
		// 문자열 크기를 비교한다.


		// 학번 기준(오름차순)
		//return Integer.parseInt(s1.getHak()) - Integer.parseInt(s2.getHak());

		
		//2308103 김다슬 70 95 91
		//2308113 길현욱 90 80 70
		//2308116 최혜인 91 81 81
		//2308120 이윤수 88 78 68
		//2308132 정현욱 99 82 79
		

		// return Integer.parseInt(s1.getHak()) - Integer.parseInt(s2.getHak());
		// return Integer.parseInt("2308113") - Integer.parseInt("2308116");
		// return 2308113 - 2308116
		// return -3
		// → o2 가 더 큰 것으로 비교 결과 전달~!!!

		// ... return 5;
		// → o1 이 더 큰 것으로 비교 결과 전달~!!!

		// ... return 0;
		// → o1 과 o2 가 같은 것으로 비교 결과 전달~!!!


		// 학번 기준(내림차순)
		//return Integer.parseInt(s2.getHak()) - Integer.parseInt(s1.getHak());
		
		//2308132 정현욱 99 82 79
		//2308120 이윤수 88 78 68
		//2308116 최혜인 91 81 81
		//2308113 길현욱 90 80 70
		//2308103 김다슬 70 95 91
		

		// 총점 기준(오름차순)
		//return s1.getTot() - s2.getTot();

		//2308120 이윤수 88 78 68
		//2308113 길현욱 90 80 70
		//2308116 최혜인 91 81 81
		//2308103 김다슬 70 95 91
		//2308132 정현욱 99 82 79
		

		// 총점 기준(내림차순)
		//return s2.getTot() - s1.getTot();
		
		//2308132 정현욱 99 82 79
		//2308103 김다슬 70 95 91
		//2308116 최혜인 91 81 81
		//2308113 길현욱 90 80 70
		//2308120 이윤수 88 78 68



		// 이름 기준(오름차순)

	

		//return (s1.getName()).compareTo(s2.getName());

		//2308113     길현욱   90   80   70
		//2308103     김다슬   70   95   91
		//2308120     이윤수   88   78   68
		//2308132     정현욱   99   82   79
		//2308116     최혜인   91   81   81
		
		// 이름 기준(내림차순)

		//return (s2.getName()).compareTo(s1.getName());

		//2308116     최혜인   91   81   81
		//2308132     정현욱   99   82   79
		//2308120     이윤수   88   78   68
		//2308103     김다슬   70   95   91
		//2308113     길현욱   90   80   70
		
		int result;

		for (int i = 0; i < 3; i++)
		{	
			만약에 s1의 이름0과 s2의 이름0이 같다면
											 같지 않다면
												비교
													 return a - b;
				만약에 s1의 이름1과 s2의 이름1이 같다면
				  .
				  .
				만약에 s1의 이름s1이름.length()와 
			result += (s1.getName()).charAt(i) - (s2.getName()).charAt(i);
		}



		return result;
		

	}


	
}




public class Test169
{
	public static void main(String[] args)
	{
		// TreeSet 자료구조 생성
		TreeSet<String> set = new TreeSet<String>();

		// TreeSet 자료구조 set 에 요소 추가 → add()
		set.add("짱구는못말려");
		set.add("슬램덩크");
		set.add("원피스");
		set.add("달빛천사");
		set.add("이누야샤");
		set.add("너의이름은");
		set.add("슈가슈가룬");
		set.add("배틀짱");
		set.add("디지몬");
		
		// Iterator 를 활용한 Set 요소 전체 출력

		Iterator<String> it = set.iterator();
		
		System.out.print("전체 요소 출력 : ");
		while (it.hasNext())
		{
			System.out.print(it.next() + " ");
		}
		System.out.println();	// 가나다 오름차순 정렬된 형태로 출력되었다. 넣은 순서 관계 없이
		//--==>> 전체 요소 출력 : 너의이름은 달빛천사 디지몬 배틀짱 슈가슈가룬 슬램덩크 원피스 이누야샤 짱구는못말려
		//-- 요소를 문자열로 구성할 경우
		//   가나다순 → 오름차순 정렬
		

		// TreeSet 자료구조 생성
		//TreeSet<GradeVO> set2 = new TreeSet<GradeVO>();

		TreeSet<GradeVO> set2 = new TreeSet<GradeVO>(new MyComparactor<GradeVO>());

		// TreeSet 자료구조 set2에 요소 추가
		set2.add(new GradeVO("2308113", "길현욱",  90,  80,  70));
		set2.add(new GradeVO("2308116", "최혜인", 91, 81, 81));
		set2.add(new GradeVO("2308120", "이윤수", 88, 78, 68));
		set2.add(new GradeVO("2308103", "김다슬", 70, 95, 91));
		set2.add(new GradeVO("2308132", "정현욱", 99, 82, 79));

		// Iterator 를 활용한 set2 요소 전체 출력
		
		/*
		Iterator<GradeVO> it2 = set2.iterator();
		
		while (it2.hasNext())
		{
			System.out.print(it2.next() + " ");
			
		}
		System.out.println();
		
		//--==>> 에러 발생(런타임 에러)
		//       java.lang.ClassCastException:
		//       GradeVO cannot be cast to java.lang.Comparable
		
		// 크기 비교 기본적으로 문자열로 한다.
		// 트리셋이라는 자료구조 자체가
		// 내부적으로 격납되는 데이터에 대해서
		// 문자열을 기반으로 비교하게끔 만들어 놓은 것이다.
		// 그렇기 때문에 Iterator 로 비교할 수가 없는 것이다.
		// (지금 GradeVO를 제네릭으로 두었기 때문에)
		// 특정한 처리를 하지 않으면 원활하게 사용할 수가 없다.
				↓
		*/
		// ※ MyComparator 클래스를 생성하여
		//    compare() 메소드를 재정의 한 후 다시 구성
		/*
		Iterator<GradeVO> it2 = set2.iterator();

		while (it2.hasNext())
		{
			System.out.print(it2.next() + " ");
		}
		System.out.println();
		*/
		//		↓
		//
		// ※ 객체 자체를 직접 출력하는 것이 아니라
		//    객체가 갖고있는 속성에 접근하여 출력할 수 있도록 처리
		//
		
		
		/*
		for (GradeVO a : set2)
		{
			System.out.printf("%s %s %d %d %d\n", a.getHak(), a.getName(), a.getKor(), a.getEng(), a.getMat());

		}
		System.out.println();
		*/

		Iterator<GradeVO> it2 = set2.iterator();
		while (it2.hasNext())
		{
			// ★☆★☆★☆★☆
			// it2.next() 를 한번 한 후에 또 그 다음으로 넘어가기 때문에
			// GradeVO [0] → GradeVO[1] 이런 식으로 넘어가므로 오류!!
			// 속성이 넘어가도록 처리해 줘야 하기 때문에 제대로 처리되지 않는다.

			//→ System.out.print(it2.next() + " " + it2.next().getName());

			GradeVO vo = it2.next();
			System.out.printf("%7s %7s %4d %4d %4d\n", vo.getHak(), vo.getName(), 
								vo.getKor(), vo.getEng(), vo.getMat());
		}
		System.out.println();
		

	}
}