정렬( 리스트, 배열 )

정렬( 리스트, 배열 )

소스코드

package study.sort;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;


/*
 * 간단하게 학생 이름과 나이를 담는 POJO Class
 */
class Student {

	private String name;
	private int age;


	public Student( String name, int age ) {
		this.name = name;
		this.age = age;
	}


	public String getName() {
		return this.name;
	}


	public void setName( String name ) {
		this.name = name;
	}


	public int getAge() {
		return this.age;
	}


	public void setAge( int age ) {
		this.age = age;
	}


	@Override
	public String toString() {
		return this.getName() + "(" + this.getAge() + ")";
	}
}



/**
 * Sorter 예제
 * 이름 오름차순으로 정렬하고, 이름이 같은 경우 나이 내림차순으로 정렬하는 예제.
 * 내림차순의 경우 Comparator의 left와 right 연산 위치를 바꾸면 됨.
 * 즉, Comparator의 return값이 음수, 0, 양수 각각의 경우에 따라 정렬되는 것이 다름.
 *
 * 예를 들어 left - right가 음수이면 right가 더 큰 경우가 된다.
 */
public class SortExample {

	public SortExample() {
	}


	/**
	 * List 정렬
	 *
	 * @param list
	 *            정렬할 리스트
	 */
	public void sort( List<Student> list ) {
		Collections.sort( list, new Comparator<Student>() {

			@Override
			public int compare( Student left, Student right ) {
				if( left.getName().equals( right.getName() ) ) {
					return right.getAge() - left.getAge();
				}

				return left.getName().compareTo( right.getName() );
			}
		} );
	}


	/**
	 * 1차원 배열 정렬
	 *
	 * @param students
	 *            1차원 배열( 원소 유형은 Student )
	 */
	public void sort( Student[] students ) {
		Arrays.sort( students, new Comparator<Student>() {

			@Override
			public int compare( Student left, Student right ) {
				if( left.getName().equals( right.getName() ) ) {
					return right.getAge() - left.getAge();
				}

				return left.getName().compareTo( right.getName() );
			}

		} );
	}


	/**
	 * 2차원 배열 정렬
	 *
	 * @param strings
	 *            String[][] 형태의 2차원 배열( [ 이름, 나이 ] 형식 )
	 */
	public void sort( String[][] strings ) {
		Arrays.sort( strings, new Comparator<String[]>() {

			@Override
			public int compare( String[] left, String[] right ) {
				if( left[ 0 ].equals( right[ 0 ] ) ) {
					return Integer.parseInt( right[ 1 ] ) - Integer.parseInt( left[ 1 ] );
				}

				return left[ 0 ].compareTo( right[ 0 ] );
			}

		} );
	}


	/**
	 * List 출력 메소드
	 *
	 * @param headerMessage
	 * @param list
	 */
	public void printOut( String headerMessage, List<Student> list ) {
		System.out.print( headerMessage + "(리스트 정렬) : " );
		System.out.println( list );
	}


	/**
	 * 1차원 배열 출력 메소드
	 *
	 * @param headerMessage
	 * @param students
	 */
	public void printOut( String headerMessage, Student[] students ) {
		System.out.print( headerMessage + "(1차원 배열 정렬) : " );
		for( int i = 0 ; i < students.length ; i++ ) {
			System.out.print( students[ i ] );
			if( i != students.length - 1 ) {
				System.out.print( ", " );
			}
		}
		System.out.println();
	}


	/**
	 * 2차원 배열 출력 메소드
	 *
	 * @param headerMessage
	 * @param strings
	 */
	public void printOut( String headerMessage, String[][] strings ) {
		System.out.print( headerMessage + "(2차원 배열 정렬) : " );
		for( int i = 0 ; i < strings.length ; i++ ) {
			System.out.print( strings[ i ][ 0 ] + "(" + strings[ i ][ 1 ] + ")" );
			if( i != strings.length - 1 ) {
				System.out.print( ", " );
			}
		}
		System.out.println();
	}


	public static void main( String[] args ) {
		/* Data 생성 */
		//@formatter:off
		Student[] students = new Student[] {
			  new Student( "홍길동", 35 )
			, new Student( "김개똥", 10 )
			, new Student( "홍길동", 20 )
			, new Student( "이상만", 13 )
			, new Student( "박대기", 12 )
		};
		//@formatter:on

		List<Student> list = new LinkedList<>();
		for( Student s : students ) {
			list.add( s );
		}

		String[][] strings = new String[ students.length ][ 2 ];
		for( int i = 0 ; i < students.length ; i++ ) {
			strings[ i ] = new String[] { students[ i ].getName(), String.valueOf( students[ i ].getAge() ) };
		}

		/*
		 * 이름순으로 오름차순 정렬하고, 이름이 같은경우 나이 순으로 오름차순 정렬
		 */
		SortExample example = new SortExample();

		// List 정렬 예시
		example.printOut( "정렬 전", list );
		example.sort( list );
		example.printOut( "정렬 후", list );

		System.out.println( "=========================" );

		// 1차원 배열 정렬 예시
		example.printOut( "정렬 전", students );
		example.sort( students );
		example.printOut( "정렬 후", students );

		System.out.println( "=========================" );

		// 2차원 배열 정렬 예시
		example.printOut( "정렬 전", strings );
		example.sort( strings );
		example.printOut( "정렬 후", strings );
	}

}

실행결과

정렬 전(리스트 정렬) : [홍길동(35), 김개똥(10), 홍길동(20), 이상만(13), 박대기(12)]
정렬 후(리스트 정렬) : [김개똥(10), 박대기(12), 이상만(13), 홍길동(35), 홍길동(20)]
=========================
정렬 전(1차원 배열 정렬) : 홍길동(35), 김개똥(10), 홍길동(20), 이상만(13), 박대기(12)
정렬 후(1차원 배열 정렬) : 김개똥(10), 박대기(12), 이상만(13), 홍길동(35), 홍길동(20)
=========================
정렬 전(2차원 배열 정렬) : 홍길동(35), 김개똥(10), 홍길동(20), 이상만(13), 박대기(12)
정렬 후(2차원 배열 정렬) : 김개똥(10), 박대기(12), 이상만(13), 홍길동(35), 홍길동(20)

Written with StackEdit.