배열 복사, 오름차순(+내림차순?)

오늘·2021년 3월 25일
0

Java

목록 보기
28/42

Arrays.copyOf()

: 새로운 배열로 특정 배열을 복사하는 메소드 함수
: 원본 배열에서 원하는 길이만큼 복사할 수 있어 활용도가 높다
: 새로운 배열 = Arrays.copyof(복사할 배열, 복사하고픈 요소만큼의 길이)
: 요소의 길이가 원본배열보다 길어도 오류없이 복사할 수 있다. 빈 공간은 숫자 0으로 채워져 출력된다.

사용해보기

int arr[] = {1,2,3,4,5,6};
		
int arrCopy1[] = Arrays.copyOf(arr, 3);
int arrCopy2[] = Arrays.copyOf(arr, 7);
		
for (int i=0; i<arrCopy1.length; i++) {
	System.out.print(arrCopy1[i] + " ");
}
		
System.out.println();
		
for (int i=0; i<arrCopy2.length; i++) {
	System.out.print(arrCopy2[i] + " ");
}

실행모습

1 2 3 
1 2 3 4 5 6 0 

-> arrCopy2를 보면 원본배열보다 카피하는 길이를 더 길게 줬음에도 오류없이 출력되는 모습을 확인할 수 있었다.


Arrays.copyOfRangs()

: 원하는 곳에서 원하는 곳까지의 특정 범위를 복사한다.
: 원하는 배열의 원하는 범위 만큼만 복사하여 새로운 배열을 만드는 메소드 함수
: 새로운 배열 = Arrays.copyOfRangs(원본배열, 원하는 범위의 시작 인덱스, 원하는 범위의 마지막 인덱스)

사용해보기

int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] arrCopy1 = Arrays.copyOfRange(arr, 2, 6);
int[] arrCopy2 = Arrays.copyOfRange(arr, 3, 13);

System.out.print("arr의 요소 중 인덱스2에서 6까지  불러오기 : ");
for(int i=0;i<arrCopy1.length;i++) {
	System.out.print(arrCopy1[i]+" ");
}
		
System.out.println();
		
System.out.print("arr의 요소 중 인덱스3에서 13까지  불러오기 : ");
for(int i=0; i<arrCopy2.length; i++) {
	System.out.print(arrCopy2[i] + " ");
}

실행결과

arr의 요소 중 인덱스2에서 6까지  불러오기 : 2 3 4 5 
arr의 요소 중 인덱스3에서 13까지  불러오기 : 3 4 5 6 7 8 9 10 0 0 

-> 마찬가지로 원본배열의 크기를 넘어 복사하겠다 말해도 오류나지 않고 출력 된다.


System.arraycopy

: System.arraycopy(원본 배열, 어떤 인덱스부터 카피할거니, 카피 배열, 몇 번 인덱스부터 채워넣을래, 몇 개 채워넣을래);
: System.arraycopy(src, srcPos, dest, destPos, length);
: 카피할 배열의 범위를 잡준 다음 사용한다. 원본 배열보다 길어도 상관 없다.
: srcPos에서 선택한 숫자가 원본 배열의 인덱스 번호가 되고
destPos에서 선택한 인덱스가 카피 배열에서의 시작 인덱스가 된다. 2로 잡으면 0,1의 인덱스는 건너 뛰는 것
lenth는 말그대로 그 길이만큼 복사한다.

사용해보기

char[] arr1 = {'J', 'A', 'V', 'A'};
	
// 카피 배열 값 주기
char[] arr3 = {'S', 'T', 'U', 'D', 'Y'};

System.arraycopy(arr1, 0, arr3, 2, 2);
System.out.println(arr3);

System.arraycopy(arr1, 0, arr3, 2, 2);
-> arr배열에서 0번 인덱스부터 2개를 복사하겠다했고, 그것을 arr3배열에 2번 인덱스부터 넣겠다고 작성해주었다.

실행모습

STJAY

Arrays.sort()

: 배열을 오름차순으로 정렬해주는것
1. Arrays.sort(정리할 배열) : 배열을 오름차순으로 정렬
2. Arrays.sort(정리할 배열, i, j) : 배열을 i 부터 j 까지 오름차순으로 정렬

배열 정렬, 부분정렬 사용해보기

// arr1 배열을 오름차순으로 정리하기
int[] arr1 = {5,3,7,2,8,6,0,4};
Arrays.sort(arr1);
for (int i=0; i<arr1.length; i++) {
	System.out.print(arr1[i] + " ");
}
		
System.out.println();
		
// arr2 배열을 2번 인덱스부터 오름차순 정리하기
int[] arr2 = {4,2,6,8,0,1};
Arrays.sort(arr2,2,arr2.length);
for(int i=0; i<arr2.length; i++) {
	System.out.print(arr2[i] + " ");
}

실행 결과

0 2 3 4 5 6 7 8 
4 2 0 1 6 8 

정렬 내림차순?

  1. sort()는 내림차순을 지원하지 않습니다. 하지만 for문을 이용해 오름차순 정렬된것을 뒤집어 출력할 수는 있죠

for문으로 사용해보기

int[] arr3 = {1,3,4,2,5};
Arrays.sort(arr3);

// 배열 끝부터 거꾸로 하나씩 출력해주겠다
for (int i = (arr3.length) - 1; i >= 0; i--) {
	System.out.print(arr3[i] + " ");
}

실행 결과

5 4 3 2 1 

  1. Comparable인터페이스를 구현해서 사용하는 것도 가능하다.

Comparator 인터페이스로 사용해보기

// 익명 구현 객체로
// 내림차순 정렬
Integer[] scores1 = {94, 99, 97, 98, 88};
Arrays.sort(scores1, 0, 3, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }
});

System.out.println(Arrays.toString(scores1));

실행 모습

[99, 97, 94, 98, 88]

  1. String도 정렬이 가능하다. 아스키코드를 비교해 사전상으로 앞에있는 수부터 정렬이 된다.

String으로 사용해보기

String[] name = {"홍길동", "김자바", "이공부", "박이것", "유저것"};
Arrays.sort(name);
for (String names1 : name) {
	System.out.print(names1 + " ");
}

실행모습

김자바 박이것 유저것 이공부 홍길동 

String으로 사용해보기 (부분정렬)

String[] name1 = {"홍길동", "김자바", "이공부", "박이것", "유저것"};
Comparator<String> c = new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		return o1.compareTo(o2);
	}
};
// 원본배열, 시작 인덱스, 끝 인덱스, comparator
Arrays.sort(name1, 0, 3, c);
for (String names1 : name1) {
	System.out.print(names1 + " ");
}

실행 모습

김자바 이공부 홍길동 박이것 유저것 

  1. String도 Comparator를 사용해 내림차순 정리가 가능하다. 문자열을 비교하는 코드를 구현할 수도 있다.

String으로 사용해보기 (내림차순)

String[] name2 = {"홍길동", "김자바", "이공부", "박이것", "유저것"};
Comparator<String> c2 = new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		// 이 비교 부분을 뒤집어 주면 된다
		return o2.compareTo(o1);
	}
};

Arrays.sort(name2, c2);
for (String names2 : name2) {
	System.out.print(names2 + " ");
}

실행모습

홍길동 이공부 유저것 박이것 김자바 

String으로 사용해보기 (문자열 길이 순서로 정렬)

String[] arr = {"Apple", "Kiwi", "Orange", "Banana", "Watermelon", "Cherry"};

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

System.out.println(Arrays.toString(arr));

실행 모습

[Kiwi, Apple, Orange, Banana, Cherry, Watermelon]

객체 배열 정렬(Sorting)

클래스에 Comparable을 구현하여 비교할 수 있게 해야한다.
1. 아래와 같이 Member클래스를 만들어주었다.

String name;
Integer num;
	
public Member03_1(Integer num, String name) {
	this.name = name;
	this.num = num;
}
	
@Override
public int compareTo(Member03_1 o) {
	int result = num.compareTo(o.num);
	if(result == 0) {
		int result2 = name.compareTo(o.name);
		return result2;
	} else {
		return result;
	}
}
  1. 위 클래스에서 Comparable은 자기 자신의 클래스와 인자로 전달되는 숫자, 이름을 검색합니다.
Member03_1 m1 = new Member03_1(2021, "홍길동");
Member03_1 m2 = new Member03_1(2021, "박동수");
Member03_1 m3 = new Member03_1(2018, "김민수");

Member03_1[] members = {m1, m2, m3};

Arrays.sort(members);
for (int i=0; i<members.length; i++) {
	System.out.println(members[i].num + " " + members[i].name);
}

실행 모습

2018 김민수
2021 박동수
2021 홍길동

0개의 댓글