소스코드
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.