본문 바로가기

개발/Java

Java 배열 정렬

알고리즘 문제를 풀다보면 배열이나 리스트를 정렬해야할 때가 있습니다.

그래서 배열의 정렬에 대해 정리를 해보았습니다.

 

1. 기본 오름차순 정렬

Arrays.sort() 함수로 기본 오름차순 정렬을 합니다.

Integer arr[] = {1,2,5,3,10,12,11};
		
Arrays.sort(arr); //오름차순 정렬
		
System.out.println(Arrays.toString(arr));

 

2. 부분 정렬

Arrays.sort 함수에 파라미터를 주어서 정렬합니다.

Integer arr[] = {1,2,5,3,10,12,11};
Arrays.sort(arr,4,6);//배열의 4~6번째 인덱스만 오름차순으로 정렬
System.out.println(Arrays.toString(arr));

 

3. 내림차순 정렬

Collections.reverseOrder() 함수를 이용해 정렬합니다.

그런데 Collections.reverseOrder 함수는 primitive type에는 지원하지 않아 int 대신 Integer형으로 배열을 생성했습니다.

Integer arr[] = {1,2,5,3,10,12,11}; //int는 Collections.reverOrder를 지원하지 않음
Arrays.sort(arr, Collections.reverseOrder()); //배열을 내림차순으로 정렬
System.out.println(Arrays.toString(arr));

 

4. 객체 정렬

선수라는 객체가 이름과 점수를 가지고 있을 때 점수를 기준으로 정렬을 해야한다면 어떻게 해야할까요?

이때는 Java에서 제공하는 Comparable과 Comparator 인터페이스를 이용하여 할 수 있습니다.

 

우선 Comparable을 사용하여 정렬하는 법을 코드로 보겠습니다.

class Player implements Comparable<Player>{
	private int score;
	private String name;
	public Player(String name, int score) {
		this.name = name;
		this.score = score;
	}
	@Override
	public int compareTo(Player o) {
		return this.score - o.score;
        //내림차순 정렬은 return o.score - this.score;
	}
	
	public String getName() {
		return this.name;
	}
	public int getScore() {
		return this.score;
	}
	
}

Comparable은 선수라는 클래스에 score라는 점수라는 변수를 기준으로 정렬을 할 수 있게 해줍니다. 즉 하나의 변수에 의해서만 정렬이 가능하죠. Player라는 클래스를 만들 때 Comparable을 상속받고 compareTo 함수를 오버라이드 해주시면 됩니다.

 

 

다음은 Comparator의 코드입니다.

class PlayerSorting implements Comparator<Player>{

	@Override
	public int compare(Player o1, Player o2) {
		
		//내림차순 o2.getScore() - o1.getScore();
		return o1.getScore() - o2.getScore();
	}
	
}

Comparator는 클래스 자체로 정렬 규칙입니다. 하나이상의 변수를 가지고 정렬을 할 수 있는 규칙을 만드는게 가능합니다.

 

 

아래는 정렬 관련된 코드의 전체입니다.

도움이 되셨길 바랍니다.

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

public class Sorting {
	public static void main(String[] args) {
		Integer arr[] = {1,2,5,3,10,12,11}; //int는 Collections.reverOrder를 지원하지 않음
		
		Arrays.sort(arr); //오름차순 정렬
		
		System.out.println(Arrays.toString(arr));
		
		Arrays.sort(arr,4,6);//배열의 부분만 오름차순으로 정렬
		System.out.println(Arrays.toString(arr));
		
		Arrays.sort(arr, Collections.reverseOrder()); //배열을 내림차순으로 정렬
		System.out.println(Arrays.toString(arr));
		
		//객체 정렬(score를 기준으로 정렬)
		Player playerArr[] = {new Player("John", 53), new Player("Thomas", 100),new Player("Paul", 21) };
		
		Arrays.sort(playerArr);
		for(Player p : playerArr){
			System.out.print(p.getName() + " " + p.getScore()+ ", ");
		}
		
		Arrays.sort(playerArr, new PlayerSorting());
		for(Player p : playerArr){
			System.out.print(p.getName() + " " + p.getScore()+ ", ");
		}
		
		 
	}
	
}
class Player implements Comparable<Player>{
	private int score;
	private String name;
	public Player(String name, int score) {
		this.name = name;
		this.score = score;
	}
	@Override
	public int compareTo(Player o) {
		//내림차순 정렬은 return o.score - this.score;로 변경해주면 됌
		return this.score - o.score;
	}
	
	public String getName() {
		return this.name;
	}
	public int getScore() {
		return this.score;
	}
	
}

class PlayerSorting implements Comparator<Player>{

	@Override
	public int compare(Player o1, Player o2) {
		
		//내림차순 o2.getScore() - o1.getScore();
		return o1.getScore() - o2.getScore();
	}
	
}

'개발 > Java' 카테고리의 다른 글

Import vs Import static  (0) 2021.06.17
Shallow copy와 Deep copy  (0) 2021.03.25
암호화란? (ECB 샘플 코드)  (0) 2021.03.16
Scanner vs BufferedReader 비교  (0) 2021.02.10
로컬 java 프로세스를 jconsole로 모니터링  (0) 2020.06.23