java.util.Arrays

Arrays 클래스는 배열의 정렬, 비교, 검색 등의 기능을 제공한다. Arrays 클래스는 Math 클래스와 같이 객체가 될 수 없다. 따라서 모든 메소드가 static이다.

Arrays 클래스의 유용한 메소드

public static int binarySearch(byte[] a, int key) {

...

public static int binarySearch(double[] a, double key)

해당 배열 a로부터 key 값을 이진 검색하여 key가 있는 위치를 반환한다. 만약 key가 존재하지 않으면 음수를 반환한다.

public static int binarySearch(Object[] a, Object key)

객체형 배열 a로부터 객체 key를 이진 검색하여 key가 있는 위치를 반환한다. 만약 key가 존재하지 않으면 음수를 반환한다.

public static boolean equals(byte[] a, byte[] a2)

...

public static boolean equals(double[] a, double[] a2)

두 배열, a와 a2의 모든 원소가 같으면 true를, 아니면 false를 반환한다.

public static boolean equals(Object[] a, Object[] a2)

두 객체형 배열, a와 a2의 모든 원소가 같으면 true를, 아니면 false를 반환한다.

public static void fill(byte[] a, byte val)

...

public static void fill(double[] a, double val)

public static void fill(Object[] a, Object val)

배열 a의 모든 원소를 val로 채운다(대입한다).

public static void fill(byte[] a, int fromIndex, int toIndex, byte val)

...

public static void fill(double[] a, int fromIndex, int toIndex, double val)

public static void fill(Object[] a, int fromIndex, int toIndex, Object val)

배열 a에서 fromIndex ~ toIndex-1까지의 원소를 val로 채운다.

public static void sort(byte[] a)

...

public static void sort(double[] a)

public static void sort(Object[] a)

주어진 배열 a를 오름차순으로 정렬한다.

public static void sort(byte[] a, int fromIndex, int toIndex)

...

public static void sort(double[] a, int fromIndex, int toIndex)

public static void sort(Object[] a, int fromIndex, int toIndex)

주어진 배열 a에서 fromIndex ~ toIndex-1까지의 원소를 오름차순으로 정렬한다.

알아두기

순차 검색과 이진 검색

순차 검색: 정렬되지 않은 배열에서 키를 검색하는 방법

이진 검색: 정렬된 배열에서 키를 검색하는 방법

순차 검색은 어떤 상황에서도 사용될 수 있는 반면에 이진 검색에 비해 많은 비교를 한다. 이진 검색은 정렬되어 있는 배열에서만 사용되며 순차 검색에 비해 매우 빠르다.

Arrays1.java

import java.util.*;

public class Arrays1{

  public static void main(String[] args){

    int[] a=new int[]{52, 38, 43, 21, 15, 27, 32, 54, 36, 79};

    Arrays.sort(a);                    // 정렬

    for(int i=0;i<a.length;i++)            // 모든 원소를 출력한다.

      System.out.print(a[i]+" ");

    System.out.println("\n54가 있는 위치:" + Arrays.binarySearch(a, 54));

    System.out.println("41이 있는 위치:" + Arrays.binarySearch(a, 41));

  }

}


출력 결과

15 21 27 32 36 38 43 52 54 79

54가 있는 위치: 8

41이 있는 위치: -7


기본 자료(정수, 실수)는 크기의 대소 비교가 가능하지만 객체는 어떻게 대소 비교할 수 있을까? 자바는 직렬화 될 수 있는 객체와 직렬화 될 수 없는 객체로 나누듯이, 비교 가능한 객체와 비교 불가능한 객체로 나눈다. 이것도 인터페이스로 구현된다. 비교 가능한 객체는 Comparable 인터페이스를 구현한다. Comparable을 구현하지 않는 객체는 비교할 수 없는 객체이다.

Comparable 인터페이스는 다음과 같이 정의되어 있다.

// java.lang.Comparable

public interface Comparable {

   public int compareTo(Object o);

}

사용자는 compareTo()를 구현해야된다. compareTo()의 역할은 다음과 같다.

public int compareTo(Object o);

this가 o보다 작으면 음의 정수를, this가 o보다 크면 양의 정수를, 같으면 0을 반환한다.

예를 들어, 사각형 객체들이 있다. 사각형을 서로 비교할 때 비교 기준을 무엇으로 정하면 될까? 넓이로 하면 될 것 같다. 다음 예제를 해보자.

Arrays2.java

class Sagak implements Comparable{     // 사각형 클래스

  private int width;                         // 가로

  private int height;                        // 세로

  Sagak(int width, int height){              // 생성자

    this.width=width;

    this.height=height;

  }

  int getArea(){                            // 면적을 구하는 메소드

    return width*height;

  }

  public int compareTo(Object o){         // CompareTo 오버라이드

Sagak s=(Sagak)o;                   // 사각형 객체로 형 변환

return getArea()-s.getArea();         // 면적의 차를 반환

  }

}

public class Arrays2{

  public static void main(String[] args){

    Sagak a=new Sagak(1,2);              // 넓이가 1*2인 사각형

    Sagak b=new Sagak(2,3);              // 넓이가 2*3인 사각형

    System.out.println(a.compareTo(b));

  }

}


출력 결과

-4


Arrays 클래스의 sort(Object[] a)는 CompareTo 메소드를 사용하여 내부에서 비교 정렬한다. 따라서 정렬하고자 하는 객체는 반드시 Comparable를 구현하고 있어야 될 것이다. 참고로 String 클래스도 Comparable을 구현하고 있다.

int a = new String("abc").compareTo("def");  // a=-3

다음은 사각형 객체 배열을 정렬하는 예제이다.

Arrays3.java

import java.util.*;

public class Arrays3{

  public static void main(String[] args){

    Sagak[] a={new Sagak(2,5),new Sagak(3,3),

               new Sagak(1,2),new Sagak(2,2)};       // 사각형 배열

// 정렬, compareTo 메소드를 사용하여 비교한다.

Arrays.sort(a);

    for(int i=0;i<a.length;i++)                         // 넓이를 출력한다.

      System.out.println(a[i].getArea());

  }

}


출력 결과

2

4

9

10


Tistory 태그: ,

+ Recent posts