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
'IT > Language' 카테고리의 다른 글
[JAVA] java exception (0) | 2008.09.21 |
---|---|
[JAVA] Map / HashMap / TreeMap / Hashtable (0) | 2008.09.21 |
[JAVA] Job Scheduling in Java (0) | 2008.09.21 |
[javascript] 테이블의 행추가 행삭제 (0) | 2008.09.20 |
[javascript] 금액표시/숫자여부체크/replace (0) | 2008.09.20 |