새소식

JAVA (개념, 알고리즘)

Collections 클래스로 객체 생성, 정렬, 병합, 검색하기

  • -

Collections클래스는 Collection 인터페이스를 구현한 클래스에 대한 객체 생성, 정렬, 병합, 검색 등의 기능을 안정적으로 수행하도록 도와주는 utility 클래스이다.

이는 Generic 기술을 사용하여 작성되었으며, 정적 메소드의 형태로 되어있다.

 

Generic 이란?
=> 데이터 타입을 일반화한다는 의미이다.
클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시 미리 저장하는 방법을 말한다.
이렇게 컴파일을 하게 되면, 미리 타입 검사를 할 수 있으며, 이는
* 클래스나 메소드 내부에서 사용되는 객체의 안정성을 높인다.
* 반환값에 대한 타입 변환 및 타입 검사에 들어가는 과정을 감소시킬 수 있다.

 

자주 사용되는 알고리즘으로는 정렬(Sorting), 섞기(Shuffling), 탐색(Searching) 등이 있다.

주요 메서드 (자주 쓰이는 것을 굵게 표시)

  • max : 컬렉션에서 최대 요소 반환
  • min : 컬렉션에서 최소 요소 반환
  • sort : 컬렉선 정렬
  • binarySearch : 컬렉션에서 이진 탐색 알고리즘을 사용해 지정된 객체를 검색해 인덱스를 반환
  • reverse : 컬렉션의 순서를 역으로 변경
  • disjoint : 2개 컬렉션에서 공통된 요소가 하나도 없는 경우 true 반환
  • copy : 컬렉션 모든 요소를 새로운 컬렉션으로 복사해 반환
  • shuffle : 컬렉션 순서 무작위로 섞기
  • synchronizedCollection : 컬렉션에 의해 지원되는 동기화된 컬렉션을 재생성하여 반환
더보기
더보기

💡 주의사항 -> 리스트가 비어있을 경우 NoSuchElementException이 발생함
👉🏻 리스트가 비어있을 경우에 대한 기본값 처리 필수

List<Integer> numbers = List.of(4, 0, 5, 2, 7, 1, 8, 6, 9, 3);
int max = numbers.isEmpty() ? -1 : Collections.max(numbers);
System.out.println("Max: " + max); // Max: 9

Collections.sort

  • 정적 메소드
  • List 인터페이스를 구현한 컬렉션에 대하여 정렬 수행 -> 합병 정렬을 사용하여 속도가 비교적 빠르고, 안정성이 보장된다.
  • Comparable 인터페이스를 통해 이루어짐. List 인터페이스에서 Comparable 인터페이스를 상속하기 때문에 Collections.sort 사용이 가능한 것!
더보기
더보기

Comparable 인터페이스란 ?

1. "자기 자신과 매개변수 객체를 비교한다."

Java에서 같은 타입의 인스턴스를 서로 비교하는 클래스들은, 모두 Comparable 인터페이스를 구현하고 있다.

Wrapper 클래스의 인스턴스 (Byte, Short, Character, Integer, Float, Double, Boolean, Long 등은 정렬 가능)

String, time, Date 등의 클래스 인스턴스 또한 정렬 가능

 

2. compareTo() 메소드 필수 구현 : 매개 변수 객체를 현재 객체와 비교하여 작으면 음수, 같으면 0, 크면 양수를 반환한다.

class Student implements Comparable<Student> {
 
	int age;			// 나이
	int classNumber;	// 학급
	
	Student(int age, int classNumber) {
		this.age = age;
		this.classNumber = classNumber;
	}
	
	@Override
	public int compareTo(Student o) {
 
		/*
		 * 만약 자신의 age가 o의 age보다 크다면 양수가 반환 될 것이고,
		 * 같다면 0을, 작다면 음수를 반환할 것이다.
		 */
		return this.age - o.age;
	}
}
더보기
더보기

Comparator 인터페이스란 ?

1. "두 매개변수 객체를 비교한다."

 

2. compare(T o1, T o2) 메서드 필수 구현

Arrays.sort(arr, comp);		// Comparator을 구현한 익명객체를 넘겨줌

static Comparator<MyInteger> comp = new Comparator<T>() {

    @Override
    public int compare(T o1, T o2) {
        return o1.value - o2.value;
    }
};

Collections.binarySearch();

  • 정렬된 리스트에서 지정된 원소를 이진탐색함.
  • 반환값 양수 => 찾고자 하는 원소의 인덱스를 출력
  • 반환값 음수 -> 찾고자 하는 원소가 없는 것을 의미
더보기
더보기
ArrayList<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(10);
        list.add(20);

        // 10 은 현재 3번째 위치에 있습니다.
        int index = Collections.binarySearch(list, 10);
        System.out.println(index);

        // 13 은 현재 없습니다. 13 은 4번째 위치에 추가 되었을 것 입니다.
        // 그래서 이 함수는 (-4-1), 즉 -5를 리턴하게 됩니다.
        index = Collections.binarySearch(list, 15);
        System.out.println(index);

search 대상을 찾았을 때는 그 대상의 위치를, 만약 찾지 못했을때는 (-insertion point)-1에 해당하는 값을 리턴하게 됩니다.
insertion point는 해당 리스트에 그 key가 존재 했다면, 그 key가 삽입되었을 위치를 말합니다.
지정한 comparator를 사용해 list의 요소를 비교할 수 없을때나, key를 비교할 수 없을 때 ClassCastException이 발생할 수 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.