[Java] Arrays & Comparator & Comparable

eeminsu·2021년 11월 18일
0
post-thumbnail

자바의 정석을 통해 공부한 내용을 요약하였습니다.

Arrays

1. 특징

  • 배열을 다루는데 유용한 메서드가 정의 되어있는 클래스


2. 메서드

2-1. 출력

  • toString() - 배열의 내용을 출력, 배열의 타입별로 오버로딩 되어있음
  • deepToString() - 배열의 모든 요소를 재귀적으로 접근하여 출력, 다차원 배열 출력

2-2. 복사

  • copyOf([] arr, int len) - 배열의 내용을 len만큼 복사
  • copyOfRange([] arr, int start, int end) - 배열의 내용을 start 부터 end -1까지 복사
int[] arr = {1,2,3,4,5};
int[] arr2 = Arrays.copyOf(arr, 3); // arr2 = [1,2,3]
int[] arr3 = Arrays.copyOfRange(arr,1,4); // arr3 = [2,3,4];

2-3. 채우기

  • fill([] arr, int val) - 배열의 모든 요소를 지정된 값(val)으로 채움
  • setAll([]arr, func()) - 배열의 요소를 함수형 인터페이스를 매개변수로 받아 채움, 람다식 사용
int[] arr = new int[5];
Arrays.fill(arr,7); // arr = [7,7,7,7,7]
Arrays.setAll(arr, () -> (int)(Math.random()*5)+1); // arr = [1,4,2,3,5] 랜덤 값

2-4. 정렬, 검색

  • sort() - 배열의 요소를 정렬
  • binarySearch() - 배열에서 지정된 값이 저장된 위치를 찾아서 반환, 반드시 정렬된 상태에서 사용

2-5. 비교

  • equals(arr1, arr2) - 두 배열의 모든 요소를 비교, 같으면 true, 다르면 false
  • deepToEquals(arr1, arr2) - 다차원 배열 비교

2-6. List 변환

  • asList(Object.. a) - 배열을 List에 담아서 반환, 반환한 List는 크기를 변경할 수 없음, 저장된 내용은 변경 가능
List list = new ArrrayList(Arrays.asList(1,2,3,4,5)); // 배열을 List로 변환한 후 ArrayList로 생성하면 수정 가능



Comparator & Comparable

컬렉션을 정렬하는데 필요한 메서드를 정의하고 있는 인터페이스

  • Comparable - 기본 정렬기준을 구현하는데 사용
  • Comparator - 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
public interface Comparator{
    int compare(Object o1, Object o2);
    boolean equals(Object obj);
}

public interface Comparable{
    public int compareTo(Object o);
}
  • compare()와 compareTo()는 선언형태와 이름만 다를 뿐 두 객체를 비교한다는 같은 목적으로 고안되었다.
  • compare()와 compareTo()는 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하다.


3. Arrays.sort로 보는 Comparator, Comparable

static void sort(Object[] a) // 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬
  • Arryas.sort()는 정렬대상과 정렬기준(Comparator)를 지정하여 사용한다.
    만약 정렬기준이 지정되지 않는다면 저장하는 객체에 구현된 내용에 따라 정렬된다.
    (Comparable을 구현한 클래스의 객체)

예시

정렬은 두 대상을 비교해서 자리바꿈을 반복하는 것이다.
정렬 방법은 바뀌지 않는다 다만, 정렬 기준은 변할 수 있다.

버블 정렬을 예로 들어보자
정렬 대상이나 정렬 기법이 바뀌어도 기법에 따른 정렬 방법은 바뀌지 않는다.
바뀌는 부분은 오직 정렬 기준만 바뀐다.(오름차순 or 내림차순)

static void sort(int[] intArr) {
	for(int i=0; i<intArr.length-1; i++) {
		for(int j=0; j<intArr.length-1-i; j++) {
			int tmp = 0;
			
			if(intArr[j] > intArr[j+1]) { // 정렬 기준
				tmp = intArr[j];
				intArr[j] = intArr[j+1];
				intArr[j+1] = tmp;
			}
		}
	}
}

static void sort(Object[] objArr, Comparator c) {
	for(int i=0; i<objArr.length-1; i++) {
		for(int j=0; j<objArr.length-1-i; j++) {
			int tmp = 0;
			
			if(c.compare(objArr[j], objArr[j+1])>0) { // 정렬 기준
				tmp = objArr[j];
				objArr[j] = objArr[j+1];
				objArr[j+1] = tmp;
			}
		}
	}
}

위 코드와 같이 코드를 변경하지 않고 Comparator를 구현한 클래스만 바꿔주어
정렬기준을 바꿀 수 있다.

profile
안되면 될 때까지

0개의 댓글