Colleciton에 대해 연산을 수행하고 결과로 Collection을 리턴하는 유용한 유틸리티 메소드를 제공한다.  Collection,List,Map,Set,SortedMap,SortedSet등의 Collection계열의 유틸리티 클래스라고 볼수 있겠다.

 

Collections 클래스의 정렬은 속도가 비교적 빠르고 안정성이 보장되는 합병 정렬을 이용한다. 합병 정렬은 시간 복잡도가 0이며 특히 거의 정렬된 리스트에 대해서는 상당히 빠르다. 안정성이란 동일한 값을 가지는 원소를 다시 정렬하지 않는 것을 의미한다. 안정성은 같은 리스트를 반복하여 다른  기준에 따라 정렬할 대 중요하다. 만약 상품 주문 리스트를 날짜를 기준으로 먼저 정렬하고 이후에 주문처를 기준으로 정렬한다면 사용자는 같은 주문처가 보낸 주문은 날짜 별로 정렬될 것이라고 가정한다. 하지만 이것은 정렬이 안정성있는 정렬인 경우에만 가능하다.

 

모든 메소드들은 Static 으로 정의되어 있기때문에 사실상 객체를 생성할 필요가 없으며 주요 메소드로서는 sort(), shuffle() 메소드 등이 있다.

 

Collections를 이용한 Sort

Collections를 이용한 Sort에는 비교할 대상(통상 Bean)Comparable 인터페이스를 Implements하여 CompareTo()Overriding하는 방법과 Comparator Implements한 클래스를 생성하여 compare()메소드를 Overriding하는 방법이 있는데 두번째 방법이 보다 유연한 방법을 제공하지만 다음의 예에서는 단순하게 첫번째 방법을 사용하겠다.

 

Comparable<T> 인터페이스를 통하여 정렬하는 방법은 public int compareTo(T o)Bean에서 구현해 주면 된다. 이 부분에서 구현해 줘야할 내용은 A B를 비교하는데 무었을 기준으로 비교할 것이냐 라는 것이다. 그것을  compareTo 함수에서 정해주고 어느것을 오름차순으로 혹은 내림차순으로 정열할지도 설정해 주면 되는 것이다.

 

요점은 A B의 비교이다. A는 자기자신. BanOther 입니다. 둘다 같은 클래스 라고 가정했을때 정렬기준을 해당 클래스의 넘버값으로 하고 싶다면

 

    if( getNumber() > anOther.getNumber() ) return 1;

      else return -1;

 

과 같이 해주면 된다.

 

1을 리턴하면 어찌되고 -1을 리턴하면 어찌되는지 애매 할것이다..

음수를 리턴할경우.        현재 클래스가 앞으로 간다.

     0을 리턴할경우.       변화가 없다.

양수를 리턴할경우.        비교대상 클래스가 앞으로 간다.

 

즉 위의 소스에서는 현재 클래스의 값이 클경우 1을 리턴 한는 것이다. 이를 간단하게 표현하자면 큰놈은 뒤로가게된다. 즉 오름차순 정렬임을 알 수 있다.

 이와 같이 compareTo의 구현이 끝났으면정렬을 하려면 정렬하려는 배열과 같은 "집단" 이어야 한다.

 

배열의경우 Arrays.sort( Object [] )   의 매개변수로 Comparable 인터페이스가 구현된 클래스 배열을 넣는다. ArrayList 같은 경우 Collections.sort( List<T> )  의 매개변수로 Comparable 인터페이스가 구현된 클래스 리스트를 넣는다.

 

Comparable을 구현한 Bean클래스 

 


public class Song implements Comparable<Song> {

       private String title;

       private String author;

       private int rank;

 

       public Song(String title, String author, int rank) {

              super();

              this.title = title;

              this.author = author;

              this.rank = rank;

       }

 

       public String getTitle() {

              return title;

       }

 

       public void setTitle(String title) {

              this.title = title;

       }

 

       public String getAuthor() {

              return author;

       }

 

       public void setAuthor(String author) {

              this.author = author;

       }

 

       public int getRank() {

              return rank;

       }

 

       public void setRank(int rank) {

              this.rank = rank;

       }

 

       @Override

       public int compareTo(Song o) {

              // 리턴값을 비교한 결과를 직접 -1, 0 또는 1 지정해도 된다.

              return title.compareTo(((Song) o).title);

       }

 

}

 



Bean들을 정렬하는 예제

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

 

/**

 * @author Steven J.S Min

 *

 */

public class SongSortTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

 

              List<Song> songList = new ArrayList<Song>();

              songList.add(new Song("제목5", "홍길동", 4));

              songList.add(new Song("제목2", "이순신", 2));

              songList.add(new Song("제목4", "윤봉길", 3));

              songList.add(new Song("제목1", "김말자", 5));

              songList.add(new Song("제목3", "김두식", 1));

 

              System.out.println("정렬전---------------------");

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

              System.out.println("정렬후---------------------");

              Collections.sort(songList);

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

              System.out.println("역순정렬-------------------");

              Collections.reverse(songList);

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

       }

}

 

 

결 과

정렬전---------------------

제목5, 홍길동, 4위

제목2, 이순신, 2위

제목4, 윤봉길, 3위

제목1, 김말자, 5위

제목3, 김두식, 1위


정렬후---------------------

제목1, 김말자, 5위

제목2, 이순신, 2위

제목3, 김두식, 1위

제목4, 윤봉길, 3위

제목5, 홍길동, 4위


역순정렬-------------------

제목5, 홍길동, 4위

제목4, 윤봉길, 3위

제목3, 김두식, 1위

제목2, 이순신, 2위

제목1, 김말자, 5위


Comparator을 구현한 Bean클래스

Comparable 인터페이스를 Implements하여 정렬하는 것은 간단하지만 열가지 필드를 조합하여 정렬한다거나 하는 경우에는 제약이 있다. 이런경우 보다 유연한 정렬을 구현하기 위하여 Comparator Implements한 클래스를 생성하여 compare()메소드를 Overriding하는 방법을 이용하여 정렬하는 것이 바람직하다.


Comparator를 이용한 정렬 예제

 


?



참조 : http://ssami.tistory.com/291
http://blog.naver.com/skykingkjs?Redirect=Log&logNo=150154268470


'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Date, Calendar and TimeZone  (0) 2013.02.08
Posted by Steven J.S Min
,