[Java] Arrays 클래스 배열 정렬

null·2022년 12월 7일
0

JAVA

목록 보기
2/8

Arrays.sort() 메서드

  • Arrays 클래스는 배열의 복사, 항목 정렬, 검색과 같은 배열을 조작 기능을 가지고 있다

배열의 오름차순 정렬

  • 기본 타입 배열 오름차순 정렬
import java.util.Arrays;

public class Test{
  public static void main(String[] args)  {
  
    int arr[] = {15,4,99,58,49,80};
    Arrays.sort(arr);

    for (int i : arr) {
      System.out.print("["+i+"]"); // [4][15][49][58][80][99]
    }
  }
}
  • String배열 오름차순 정렬(!!! String은 기본 타입이 아님)
    - 문자열의 경우 수의 크기를 비교하는것이 아니라 자리수 상관없이 앞자리 부터 차례차례 한문자씩 비교하여 크기를 결정
import java.util.Arrays;

public class Test{
  public static void main(String[] args)  {
  
    String arr[] = {"apple","null","sysout","trim","in","mac"};
    Arrays.sort(arr);

    for (String i : arr) {
      System.out.print("["+i+"]"); // [apple][in][mac][null][sysout][trim]
    }
  }
}
  • 배열 일부분 정렬: Arrays.sort(arr, 시작 index, 끝 index);
import java.util.Arrays;

public class Test{
  public static void main(String[] args)  {

    int arr[] = {15,4,99,58,49,80};
    Arrays.sort(arr, 0, 4); // 0,1,2,3 요소 정렬
    System.out.println(arr[0]); // 4
    System.out.println(arr[3]); // 99

    for (int i : arr) {
      System.out.print("["+i+"]"); // [4][15][58][99][49][80]
    }
  }
}

Collections.reverseOrder() 메서드

  • 기본 타입 배열 내림차순 정렬
import java.util.Arrays;
import java.util.Collections;

public class Test{
  public static void main(String[] args)  {

    Integer arr[] = {15,4,99,58,49,80};
    Arrays.sort(arr,Collections.reverseOrder());

    for (int i : arr) {
      System.out.print("["+i+"]"); // [99][80][58][49][15][4]
    }
  }
}
  • String 배열 내림차순 정렬
import java.util.Arrays;
import java.util.Collections;

public class Test{
  public static void main(String[] args)  {

    String arr[] = {"apple","null","sysout","trim","in","mac"};
    Arrays.sort(arr,Collections.reverseOrder());

    for (String i : arr) {
      System.out.print("["+i+"]"); // [trim][sysout][null][mac][in][apple]
    }
  }
}

Interface Comparator

  • Comparable 인터페이스를 구현한 클래스들의 기본 정렬 기준과 다르게 정렬 하고 싶을 때 사용하는 인터페이스
  • 주로 익명 클래스로 사용
  • 기존 규칙이 아닌 새로운 규칙으로 정렬하고자 할 때 사용
  • compare() 메서드 작성법
    - 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수(-1) 리턴
    - 첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴
    - 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수(1) 리턴
    - 음수(-1) 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class baekjoon_1181 {

  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int num = Integer.parseInt(br.readLine());

    String[] arr = new String[num];

    for(int i =  0 ; i < num ; i++) {
      arr[i] = br.readLine();
    }

    // Arrays.sort() : 기본타입 배열을 오름차순 정렬
    // Array.sort(arr, new Comparator <T>)
    // Comparator를 선언하게 되면 어떤 Generic type을 사용할지 정해주게 되어있고, 
    // 그 type에 해당하는 정렬을 새로 정의할 수 있다
    // 정렬을 정의하는 부분은 compare 함수 부분에 들어가게 된다
    // 이때 기준이 되는 부분을 함수의 parameter로 받게 되는데 '비교'하는 것이기 때문에 
    // parameter는 항상 두 개씩 받게 되어있다
    // parameter 값을 서로 비교한 후 return 시키는 값을 조정하는 식으로 정렬이 가능
    Arrays.sort(arr, new Comparator<String>() { //new ??

      // 기존의 규칙이 아닌 새로운 규칙으로 정렬을 해야 하므로 @Override (오버 라이딩)을 통해 
      // Comparator에 있는 메서드인 compare를 재정의
      @Override
      public int compare(String s1, String s2) {

        // 예를들어, {2, 1, 3}의 배열이 있고 public int compare(int a1, int a2) { return a1 - a2 } 가 있다면,
        // a1은 2, a2는 1이 된다. 즉, 2 - 1 = 1 이므로 양수가 반환되어 a1과 a2의 위치가 바뀌게 된다. 
        // 그러면 { 1, 2, 3 }이 되겠다.그 다음 a1, a2는 각각 2와 3이 될테고, 2 - 3 = -1 이므로 
        // 음수가 반환되어 위치가 바뀌지 않는다.
        // 양수가 반환되면 위치가 서로 바뀌고
        if (s1.length() > s2.length()) {
          return 1;

          // 음수가 반환되면 위치가 바뀌지 않는다
        } else if (s1.length() < s2.length()) {
          return -1;

          // compareTo: String문자열을 사전 순으로 정렬
          // 문자열 길이가 같다면 사전 순 정렬
        } else {
          return s1.compareTo(s2);
        }
      }
    });

    System.out.println(arr[0]);

    // 중복 제거
    for(int i = 1; i < num; i++) {
      if (!arr[i].equals(arr[i - 1])) {
        System.out.println(arr[i]);
      }
    }
  }
}

익명클래스

  • 익명클래스 생성시에는 상속받을 부모클래스 또는 구현할 인터페이스 이름과 함께 선언
  • 클래스 정의 및 객체생성의 두단계를 거치지 않고, new 연산자로 객체 생성과 동시에 { } 안에 클래스 내용 정의
- 부모클래스이름 변수명 = new 부모클래스이름 {...내용 구현};
- 인터페이스이름 변수명 = new 인터페이스이름 {...내용 구현};

0개의 댓글