[JAVA]Arrays.sort와 Collections.sort

유시준·2021년 5월 13일

JAVA

목록 보기
1/2

JAVA에서 정렬하는 법을 포스팅해보려고 한다.

우선 자바에서 정렬하는 법은 크게 2가지이다.
Arrays.sort를 사용하는 방법과 Collections.sort를 사용하는 방법이다.
Arrays.sort는 배열을 정렬할 때 사용하고 Collections.sort는 List를 정렬할 때 사용한다.
아래는 간단한 예시이다. 따로 정렬 기준을 재정의 하지 않았기 때문에 오름차순으로 출력이 된다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Test {
	public static void main(String[] args) throws Exception{
//배열 정렬 방법
		int a[]=new int[5];
		System.out.print("Arrays.sort정렬전 : ");
		for(int i=0;i<5;i++) {
			a[i]=5-i;
			System.out.print(a[i]+" ");
		}
		System.out.println();
		Arrays.sort(a);
		System.out.print("Arrays.sort정렬후 : ");
		for(int i=0;i<5;i++) {
			System.out.print(a[i]+" ");
		}
//list정렬 방법
		List<Integer> list=new ArrayList<>();
		System.out.println();
		System.out.print("Collections.sort정렬전 : ");
		for(int i=0;i<5;i++) {
			list.add(5-i);
			System.out.print(list.get(i)+" ");
		}
		System.out.println();
		Collections.sort(list);
		System.out.print("Collections.sort정렬후 : ");
		for(int num:list) {
			System.out.print(num+" ");
		}
	}
}

위 소스의 결과는 아래와 같이 나온다.

자바에서 모든 정렬의 default 값은 오름차순이다.
우선순위큐도 MinHeap으로 구성되어 있고 sort메소드를 사용할 때도 오름차순으로 되어있다.
그렇다면 사용자 정의 Class를 정렬할 때는 어떨까? 재정의를 해주지 않고 sort를 사용한다면 에러가 발생한다.
자바에서는 총 두 가지의 방법이 있다.
1. Comparable 인터페이스를 상속받아 compareTo 메소드를 구현한다.
2. Anonymous 클래스를 정의해 Comparator 인터페이스를 상속받아 compare()메소드를 구현한다.
여기서는 Member 클래스를 예를 들어 보여주겠다. id와 name이라는 멤버 변수를 가질 때 Member의 Id 오름차순 그리고 id가 같다면 name 내림차순으로 정렬해보겠다.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
	public static void main(String[] args) throws Exception{
		List<Member> list=new ArrayList<>();
		System.out.println();
		System.out.println("Collections.sort정렬전 : ");
		list.add(new Member(5,"유시준4"));
		list.add(new Member(5,"유시준5"));
		list.add(new Member(4,"유시준3"));
		list.add(new Member(3,"유시준2"));
		list.add(new Member(2,"유시준1"));
		for(Member a:list) {
			System.out.println(a+" ");
		}
		Collections.sort(list);
		System.out.println("Collections.sort정렬후 : ");
		for(Member a:list) {
			System.out.println(a+" ");
		}
	}
}
class Member implements Comparable<Member>{
	int number;
	String name;
	@Override
	public int compareTo(Member o) {
		// TODO Auto-generated method stub
		if(this.number==o.number) return o.name.compareTo(this.name);
		return this.number-o.number;
	}
	public Member(int number, String name) {
		super();
		this.number = number;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Member [number=" + number + ", name=" + name + "]";
	}
	
}

Comparable을 상속받아 compareTo메소드를 재정의한 소스의 결과

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
	public static void main(String[] args) throws Exception{
		List<Member> list=new ArrayList<>();
		System.out.println();
		System.out.println("Collections.sort정렬전 : ");
		list.add(new Member(5,"유시준4"));
		list.add(new Member(5,"유시준5"));
		list.add(new Member(4,"유시준3"));
		list.add(new Member(3,"유시준2"));
		list.add(new Member(2,"유시준1"));
		for(Member a:list) {
			System.out.println(a+" ");
		}
		Collections.sort(list,new Comparator<Member>() {

			@Override
			public int compare(Member o1, Member o2) {
				// TODO Auto-generated method stub
				if(o1.number==o2.number) return o2.name.compareTo(o1.name);
				return o1.number-o2.number;
			}
		
		});
		System.out.println("Collections.sort정렬후 : ");
		for(Member a:list) {
			System.out.println(a+" ");
		}
	}
}
class Member{
	int number;
	String name;
	public Member(int number, String name) {
		super();
		this.number = number;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Member [number=" + number + ", name=" + name + "]";
	}
	
}

Comparator를 상속받아 compare메소드를 재정의한 코드의 결과

이렇게 Java에서의 정렬과 재정의 방법에 대해 알아보았다.
참고로 내림차순을 해주고 싶다면 return형에 -를 붙여주면 내림차순으로 변경된다.

profile
금꽁치's Blog

0개의 댓글