• 객체 정렬에 필요한 메서드를 정의한 인터페이스
  • 정렬은 두 대상을 비교해서 자리 바꾸는 과정을 반복하는 것
  • 비교하는 것이 sort의 정렬 기준
  • 내림차순일 때 -1, 오름차순일 때 1을 반환하도록 구현
  • 문자의 경우 대문자가 먼저 다 나오고 소문자 다 나옴
    상관없이 정렬하고 싶다면 sort(배열, String.CASE_INTENSITIVE_ORDER);

Comparable

  • 기본 정렬 기준을 구현하는데 사용
public interface Comparable{
	int compareTo(object o); // 객체 o와 자기 자신을 비교

Comparator

  • 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용
public interface Comparator{
	int compare(object o1, object o2); // o1과 o2 두 객체를 비교
    // 결과가 0이면 같다. 양수면 왼쪽이 크다. 음수면 오른쪽이 크다
    boolean equals(object obj); equals를 오버라이딩하라는 뜻

역순으로 만들고 싶을 때는 comparator를 implement 해서 기본 정렬 방식에 -1을 곱해준다


HashSet 클래스

  • 순서x, 중복x
  • Set 인터페이스를 구현한 클래스
  • 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다
  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야함
    (set은 요소 간의 중복이 없어야 하기 때문!)
  • 동일성 구현을 위해 필요에 따라 equals() 와 hashCode() 메서드를 재정의 한다
  • hashSet을 쓸 때는 관리할 클래스 안에서 동일성을 판단해야한다

    Set은 정렬이 불가능하다. list에 set의 모든 요소를 저장하고, list를 정렬하는 방법뿐

HashSet의 주요 메서드

  • HashSet()
  • HashSet(Collection c)
  • HashSet(int initialCapacity)
  • HashSet(int initialCapacity, float loadFactor)
  • boolean add(Object o)
  • boolean addAll(Collection c)
  • boolean remove(Object o)
  • boolean removeAll(Collection c)
  • boolean retainAll(Collection c)
  • void clear()
  • boolean isEmpty()
  • int size()
  • Object[] toArray()
  • Object[] toArray(Object[] a)
  • boolean contains(Object o)
  • boolean containsAll(Collection c)
  • Iterator iterator()

예제

  1. 객체 배열을 HashSet에 저장하면 중복이 사라진다
    하지만 int 형 1과 Integer 객체 1은 다른 객체이므로 중복으로 생각되지 않아 각각 저장된다
  2. HashSet은 중복을 허용하지 않기 때문에 add() 메서드를 사용하면 equals()와 hashCode()를 호출한다
    저장할 객체의 클래스에 equals와 hashCode를 오버라이딩 한다
return name.equals(tmp.name) && age == tmp.age;
.
.
return (name+age).hashCode(); //String + hashCode 방법
return Objects.hash(name, age); //새로운 방식

TreeSet 클래스

  • 객체를 정렬하기 위해 사용하는 클래스
  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • HashSet 보다 데이터 추가, 삭제에 시간이 더 걸림
  • 오름차순이나 내림차순으로 객체를 정렬할 수 있다
  • 내부적으로 이진 검색 트리로 구현된다
  • 비교 대상이 되는 객체에 implements Comparable하고
    인터페이스를 구현해야 TreeSet에 추가할 수 있다
  • 비교 대상이 되는 Member 객체 클래스
public int compareTo(Member member) {
		
		//return (this.memberId - member.memberId);   //오름차순
		return (this.memberId - member.memberId) *  (-1);   //내림 차순
	}
}
또는 

 public int compareTo(Member member) {
 
     if (this.memberId > member.memberId){
         return 1;
     }
     else if (this.memberId < member.memberId) {
         return -1;
     } else return 0;
 }

이미 Comparable이 구현된 경우, Comparator로 비교하는 방식을 다시 구현할 수 있다

  • implements Comparator를 하여 compare하는 클래스를 만들어 compare을 재정의 한다
@Override
    public int MyCompare(String s1, String s2) {
        //return s1.compareTo(s2); // 원래 정렬과 같음
        return s1.compareTo(s2)*(-1);//내림차순으로 정렬된다
    }
  • 사용할 때는 객체를 생성할 때 만든 클래스를 넣어줘서 정렬할 방식을 알려준다
TreeSet<String> set = new TreeSet<String>(new MyCompare());
profile
안녕하세요. Chat JooPT입니다.

0개의 댓글