[Java]익명 객체와 사용자 정의 정렬

수경·2023년 8월 15일
0
post-thumbnail

익명 객체, Anonymous Object

  • 익명 클래스, Anonymous Class
  • 단타성이 있을 때 사용한다.

코드예제

인터페이스

interface AAA {
	void aaa();
}

실명 클래스

class BBB implements AAA {
	@Override
	public void aaa() {
		System.out.println("aaa");
	}
}

public class Ex66_Anonymous {
	public static void main(String[] args) {
    	
        //1. 본입 타입으로 참조 변수 만들기
		BBB b1 = new BBB();
		b1.aaa();
		System.out.println();
		
		//2. 부모 타입(인터페이스)으로 참조 변수 만들기
		AAA b2 = new BBB();
		b2.aaa();
		System.out.println();
    }
}

익명클래스

public class Ex66_Anonymous {
	public static void main(String[] args) {
		AAA b3 = new AAA() {
			@Override
			public void aaa() {
				System.out.println("aaa");
			}
		};
		b3.aaa();
    }
}

정렬, Sort

배열, 컬렉션을 정렬하는 방법

  1. 직접 알고리즘 구현
  2. JDK 제공 기능 활용 > 오름차순 기능은 있지만, 내림차순 기능이 없다.
  3. JDK 제공 기능 + 커스터마이징(익명클래스) -> 제일 많이 사용된다.

자료형별 정렬

  1. 숫자형
  2. 문자(열) > 문자코드값 정렬 > 숫자 취급
  3. 날짜시간 > 숫자 취급
  4. 객체
  5. 컬렉션
    1) ArrayList > 순서가 있는 데이터집합 > 정렬o
    2) HashMap > 순서가 없는 데이터집합 > 정렬x
    3) Queue > 순서가 있는 데이터집합 > but, 들어온 순서가 중요하기에 정렬x
    4) Stack > 순서가 있는 데이터집합 > but, 들어온 순서가 중요하기에 정렬x
    5) HashSet > 순서가 없는 데이터집합 > 정렬x

오름차순 정렬 및 숫자 내림차순 정렬 코드

		Integer[] nums = {1, 5, 2, 4, 3};
		
        System.out.println("Integer 배열 nums 요소 출력:");
		System.out.println(Arrays.toString(nums));
        
        //오름차순 정렬(Quick Sort > JDK 제공 기능)
		Arrays.sort(nums);
        System.out.println("오름차순한 nums 요소 출력:");
		System.out.println(Arrays.toString(nums));
        
        //Double형 내림차순
        Double[] nums2 = {3.1, 7.1, 3.8, 9.2, 8.9};
		//자료형이 달라지면 매번 새로운 클래스를 만들어야하므로 익명클래스로 1회성 클래스를 만들어준다.
		Arrays.sort(nums2, new Comparator<Double>() {
			@Override
			public int compare(Double o1, Double o2) {
				
				//if (o1 < o2) {
				//	return 1;
				//} else if (o1>o2) {
				//	return -1;
				//} else {
				//	return 0;
				//}
                
                //위 코드를 간결하게 작성
				return (int)((o2-o1)*10);
			
			}
		});
		System.out.println("Double 배열 nums2 요소 내림차순 출력:");
		System.out.println(Arrays.toString(nums2));
        

Integer 배열 nums 요소 출력:
[1, 5, 2, 4, 3]
오름차순한 nums 요소 출력:
[1, 2, 3, 4, 5]
Double 배열 nums2 요소 내림차순 출력:
[9.2, 8.9, 7.1, 3.8, 3.1]

문자(열) 정렬 코드


		String txt1 = "홍길동";
		String txt2 = "홍무개";
		
		//참조형은 주소값을 담고 있고, 주소값들은 연산이 될 수 없으므로 비교가 불가능하다.
		
		//문자 대 문자 비교 가능 : 문자는 문자코드이기때문에
		System.out.println('a'<'b');	//true
		
        
        //문자열 정렬
		String[] names = {"홍길동","아무개","유재석","박명수","이순신", "훈", "김철"};
		
		//가다나순으로 정렬(오름차순)
		System.out.println(Arrays.toString(names));
		System.out.println("오름차순");
		Arrays.sort(names);
		System.out.println(Arrays.toString(names));
		
		//내림차순
		System.out.println("내림차순 + 글자수 비교");
		Arrays.sort(names, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				//정렬 조건이 1개 일 때 
				//return o2.compareTo(o1);	//가나다 정렬 : 문자 코드값 비교
				//return o1.length() - o2.length();	//글자수 비교
				
				//정렬 조건 2개 : 글자수, 가나다 오름차순 정렬
				if (o1.length() > o2.length() ) {
					return 1;
				} else if (o1.length() < o2.length()) {
					return -1;
				} else {
					
					//2차 정렬 기준
					return o1.compareTo(o2);
				}
			}
		});
		System.out.println(Arrays.toString(names));```

true
[홍길동, 아무개, 유재석, 박명수, 이순신, 훈, 김철]
오름차순
[김철, 박명수, 아무개, 유재석, 이순신, 홍길동, 훈]
내림차순 + 글자수 비교
[훈, 김철, 박명수, 아무개, 유재석, 이순신, 홍길동]

날짜시간 정렬 코드

		Calendar[] dates = new Calendar[5];
		
		for (int i=0; i<dates.length; i++) {
			dates[i] = Calendar.getInstance();
		}
		
		dates[0].add(Calendar.DATE, 7);
		dates[1].add(Calendar.DATE, -2);
		dates[2].add(Calendar.DATE, 1);
		dates[3].add(Calendar.DATE, 0);
		dates[4].add(Calendar.DATE, 3);
		
		System.out.println("dates 출력");
		for (int i=0; i<dates.length; i++) {
			System.out.printf("%tF\n", dates[i]);
		}
		System.out.println();
		
		//오름차순 정렬
		Arrays.sort(dates);
		
		System.out.println("dates 오름차순 출력");
		for (int i=0; i<dates.length; i++) {
			System.out.printf("%tF\n", dates[i]);
		}
		System.out.println();
		
		//내림차순 정렬
		System.out.println("dates 내림차순 출력");
		
		Arrays.sort(dates, new Comparator<Calendar>() {
			@Override
			public int compare(Calendar o1, Calendar o2) {
				//return (int)(o2.getTimeInMillis() - o1.getTimeInMillis());	
				//getTimeInMillis 가 long타입이기에 연산할 때 위험하다.
				//차이가 너무 많이 나면 연산 결과가 음수가 아닌 양수가 나올 수 있다.
				
				return o2.compareTo(o1);
			}
		});
		
		for (int i=0; i<dates.length; i++) {
			System.out.printf("%tF %tA\n", dates[i], dates[i], dates[i]);
		}
		System.out.println();
		
		System.out.println("dates 요일 내림차순 출력");
		Arrays.sort(dates, new Comparator<Calendar>() {
			@Override
			public int compare(Calendar o1, Calendar o2) {
				
				//return (int)(o2.getTimeInMillis() - o1.getTimeInMillis());	//getTimeInMillis 가 long타입이기에 연산할 때 위험하다.
																			//차이가 너무 많이 나면 연산 결과가 음수가 아닌 양수가 나올 수 있다.
				//return o2.compareTo(o1);
				
				//요일로 정렬
				//일(1) ~ 토(7)
				return o1.get(Calendar.DAY_OF_WEEK) - o2.get(Calendar.DAY_OF_WEEK);
				
			}
		});
		for (int i=0; i<dates.length; i++) {
			System.out.printf("%tF %tA\n", dates[i], dates[i], dates[i]);
		}
		System.out.println();

dates 출력
2023-08-23
2023-08-14
2023-08-17
2023-08-16
2023-08-19

dates 오름차순 출력
2023-08-14
2023-08-16
2023-08-17
2023-08-19
2023-08-23

dates 내림차순 출력
2023-08-23 수요일
2023-08-19 토요일
2023-08-17 목요일
2023-08-16 수요일
2023-08-14 월요일

dates 요일 내림차순 출력
2023-08-14 월요일
2023-08-23 수요일
2023-08-16 수요일
2023-08-17 목요일
2023-08-19 토요일

객체 정렬 코드

		Score[] list = new Score[5];
		
		list[0] = new Score("홍길동", 100, 90, 80);
		list[1] = new Score("아무개", 10, 22, 18);
		list[2] = new Score("유재석", 78, 95, 79);
		list[3] = new Score("박명수", 56, 78, 76);
		list[4] = new Score("이순신", 99, 67, 79);
		
		System.out.println(Arrays.toString(list));
		System.out.println();
		
		//이름순으로 정렬
		//Arrays.sort(list);	//복합데이터의 정렬 기준이 없어 정렬 불가
		
		//이름순으로 정렬
		System.out.println("이름순으로 정렬");
		Arrays.sort(list, new Comparator<Score>() {
			@Override
			public int compare(Score o1, Score o2) {
				return o1.getName().compareTo(o2.getName());	
			}
		});
		
		System.out.println(Arrays.toString(list));
		
		//총점 순으로 정렬
		System.out.println("총점순으로 정렬");
		Arrays.sort(list, new Comparator<Score>() {
			@Override
			public int com_텍스트_pare(Score o1, Score o2) {
				return (o2.getKor()+o2.getEng()+o2.getMath()) - (o1.getKor() + o1.getEng() + o1.getMath());	
			}
		});
		
		System.out.println(Arrays.toString(list));

[Score [name=홍길동, kor=100, eng=90, math=80]
, Score [name=아무개, kor=10, eng=22, math=18]
, Score [name=유재석, kor=78, eng=95, math=79]
, Score [name=박명수, kor=56, eng=78, math=76]
, Score [name=이순신, kor=99, eng=67, math=79]
]

이름순으로 정렬
[Score [name=박명수, kor=56, eng=78, math=76]
, Score [name=아무개, kor=10, eng=22, math=18]
, Score [name=유재석, kor=78, eng=95, math=79]
, Score [name=이순신, kor=99, eng=67, math=79]
, Score [name=홍길동, kor=100, eng=90, math=80]
]

총점순으로 정렬
[Score [name=홍길동, kor=100, eng=90, math=80]
, Score [name=유재석, kor=78, eng=95, math=79]
, Score [name=이순신, kor=99, eng=67, math=79]
, Score [name=박명수, kor=56, eng=78, math=76]
, Score [name=아무개, kor=10, eng=22, math=18]
]

컬렉션(ArrayList) 정렬 코드

		ArrayList<Integer> list = new ArrayList<Integer>();
		
		for (int i=0; i<10; i++) {
			list.add((int)(Math.random()*100));	//0~99 난수
		}
		
		System.out.println(list);
		
		//오름차순
		//Collections클래스에서 sort() 사용 가능하다.
		Collections.sort(list);
		System.out.println("오름차순");
		System.out.println(list);
		
		
		//내림차순
		//1. Collections 클래스 sort 사용
//		Collections.sort(list, new Comparator<Integer>() {
//			@Override
//			public int compare(Integer o1, Integer o2) {
//				return o2-o1;
//			}
//		
//		});
		
		//2. 
		System.out.println("내림차순");
		list.sort(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return o2-o1;
			}
		});
		System.out.println(list);

[5, 76, 17, 96, 92, 18, 11, 80, 4, 52]
오름차순
[4, 5, 11, 17, 18, 52, 76, 80, 92, 96]
내림차순
[96, 92, 80, 76, 52, 18, 17, 11, 5, 4]

profile
웹백엔드개발자를 꿈꾸는

0개의 댓글