"Rishi, Arrays 클래스의 나머지 메서드에 대해 배우는 것이 정말 기대됩니다.
"이런 배움에 대한 열의는 옛 선생님을 기쁘게 할 수밖에 없습니다! 하지만 정말로 모든 것을 찾고 싶다면 Google이라는 친절한 마법사가 밤낮으로 당신을 도울 것입니다."
"음..."
"농담입니다. 물론 모든 것을 더 잘 설명하겠습니다. 하지만 문제가 발생하면 좋은 마법사를 기억하십시오. 방법으로 오늘 수업을 시작하겠습니다 Arrays.fill
.
"배열로 작업할 때 Java 프로그래머는 종종 동일한 값으로 배열을 채워야 합니다. 물론 루프를 작성하고 루프에서 배열의 각 셀에 일부 값을 할당할 수 있습니다.
int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;
"또는 이 모든 것 대신 Arrays.fill()
정확히 동일한 작업을 수행하는 메서드를 호출할 수 있습니다. 전달된 값으로 전달된 배열을 채웁니다. 모양은 다음과 같습니다.
Arrays.fill(name, value)
그리고 위 예제의 코드는 좀 더 간결하고 명확하게 만들 수 있습니다.
int[] x = new int[100];
Arrays.fill(x, 999);
"아름다운!"
Arrays.fill()
"이 방법을 사용하여 전체 배열이 아닌 일부 값을 채울 수도 있습니다 .
Arrays.fill(name, first, last, value)
" 처음 과 마지막은 채워질 첫 번째와 마지막 셀의 인덱스입니다.
" Java의 좋은(또는 나쁜) 오래된 전통에 따라 마지막 요소는 범위에 포함되지 않는다는 점을 기억하십시오.
예:
|
셀 x[3] , x[4] , x[5] 및 x[6] 값을 채우고 있습니다 999 . 배열의 셀은 0부터 시작하여 번호가 매겨집니다! 변수 는 str 값을 포함합니다"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]" |
"이 Arrays.fill()
방법은 1차원 배열에서만 작동합니다. 2차원 배열을 메서드에 전달하면 1차원으로 처리되며 모든 후속 결과가 발생합니다.
Arrays.copyOf()
"아미고, 어레이가 생성된 후 어레이의 크기를 변경하는 방법을 알려주세요."
"음... 그건 속임수 질문이죠? 저는 더 이상 경험이 부족하지 않습니다. 정답은 할 수 없다는 것입니다! 배열이 생성된 후에는 크기를 조정할 수 없습니다."
"하지만 정말로 원한다면?"
"그래도 불가능해!
"실제로, 정말로 원한다면 할 수 있습니다! 프로그래밍 트릭의 도움으로:
- 먼저 원하는 길이의 새 배열을 만듭니다.
- 그런 다음 첫 번째 배열의 모든 요소를 여기에 복사합니다.
"메소드가 수행하는 두 가지 작업입니다 Arrays.copyOf()
. 다음과 같이 호출합니다.
Type[] name2 = Arrays.copyOf(name, length);
"이 방법은 기존 배열을 변경하지 않고 대신 새 배열을 만들고 이전 배열의 요소를 복사합니다."
" 새 어레이의 길이가 기존 어레이의 길이 보다 작으면 어떻게 됩니까 ?
"좋은 질문입니다, 아미고! 요소가 맞지 않으면 추가 값은 무시됩니다."
"그리고 반대로 여분의 셀이 있다면, 그들의 초기 값은 무엇입니까?
"새 배열의 길이가 이전 배열의 길이보다 크면 셀이 0으로 채워집니다.
예:
|
변수 str2 에 값이 포함됨 변수 에 값이 포함됨"[1, 2, 3, 4, 5]" str3 "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]" |
Arrays.copyOfRange()
"그리고 길이가 10인 배열에서 길이가 5인 배열을 가져오고 싶지만 처음 5개 요소가 아닌 마지막 5개 요소를 포함해야 하는 경우에는 어떻게 해야 합니까? 이 경우 클래스의 다른 메서드가 필요합니다. Arrays
바로 Arrays.copyOfRange()
. 다음과 같이 호출합니다.
Type[] name2 = Arrays.copyOfRange(name, first, last);
"이 방법도 새 배열을 생성하지만 원래 배열의 임의 위치에 있는 요소로 배열을 채웁니다. 여기서 첫 번째 와 마지막 은 새 배열에 넣어야 하는 첫 번째 요소와 마지막 요소의 인덱스입니다. 마지막 요소가 이 범위에 포함됩니까?"
"하! 나의 위대한 스승이 ' 자바의 좋은(혹은 나쁜) 오래된 전통에 따라, 마지막 요소가 범위에 포함되지 않는다는 것을 기억하라 ' 라고 말하곤 했습니다 ."
"아미고, 당신은 우리 눈앞에서 자라고 있습니다.
예:
|
변수 str2 에 값이 포함됨 변수 에 값이 포함됨"[16, 17, 18, 19, 20]" str3 "[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]" |
Arrays.sort()
"그리고 마지막으로, 가장...음...마지막으로 즐거운 방법인 정렬을 남겼습니다 . 배열은 프로그래밍에서 매우 자주 정렬됩니다. 다음은 배열로 작업할 때 가장 많이 사용되는 3가지 작업입니다.
- 배열 정렬
- 배열의 최소(또는 최대) 요소 찾기
- 배열에서 요소의 인덱스 결정(배열에서 요소 찾기)
"잘 수행되는 정렬 알고리즘은 작성하기가 쉽지 않습니다. 더 정확하게는 이것은 표준 작업이며 학생으로서 가끔 정렬 알고리즘 작성을 연습하는 것은 해가 되지 않습니다. 하지만 직장에서는 바퀴를 재발명하느라 시간을 낭비하지 않는 것이 좋습니다. Java 작성자는 클래스 sort()
에 메소드를 포함시켰습니다 Arrays
. 다음과 같이 호출합니다.
Arrays.sort(name);
이 메서드는 전달된 배열을 오름차순으로 정렬합니다.
예:
|
변수 는 str 값을 포함합니다"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]" |
"훌륭합니다! 메서드를 하나만 호출했는데 배열이 정렬되었습니다. 정말 아름답습니다!"
"그런데 전체 배열뿐만 아니라 일부만 정렬할 수도 있습니다. 다음과 같이 호출합니다.
Arrays.sort(name, first, last);
"여기서 첫 번째 와 마지막 은 정렬이 터치해야 하는 첫 번째와 마지막 셀의 인덱스입니다. 그리고...
"무슨 말을 하려는지 이미 알고 있습니다! 'Java의 좋은(또는 나쁜) 오래된 전통에 따라 마지막 요소가 범위에 포함되지 않는다는 점을 기억하세요.' .
예:
|
변수 는 str 값을 포함합니다"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]" |
"배열을 정렬하기 위해 Java는 가장 빠른 정렬 알고리즘인 QuickSort를 사용합니다 . 계산 복잡성은 배열의 크기에 따라 달라지며 N log(N) 공식을 사용하여 계산됩니다.
"1000개 요소의 배열을 정렬하려면 약 10,000번의 배열 요소 비교가 필요합니다. 100만 요소의 배열을 정렬하려면 약 2천만 번의 비교가 필요합니다."
" 요소 수를 고려할 때 너무 많은 비교가 아닙니다!"
"그게 바로 내가 말하는 것입니다. QuickSort 알고리즘은 매우 효율적입니다.
Arrays.binarySearch()
"글쎄요, 클래스의 가장 흥미로운 마지막 메서드는 Arrays
배열에서 주어진 값을 검색할 수 있습니다. 이것은 일반적인 검색이 아닙니다. 사랑받는 이진 검색 입니다 . 요약하면 다음과 같습니다.
- 먼저 배열이 정렬됩니다.
- 그런 다음 배열의 중간 요소를 찾고 있는 요소와 비교합니다.
- 요소가 중간 요소보다 크면 배열의 오른쪽 절반에서 검색이 계속됩니다.
- 찾고 있는 요소가 중간 요소보다 작으면 배열의 왼쪽 절반에서 검색이 계속됩니다.
"배열이 정렬되어 있기 때문에 한 번의 비교로 절반을 제거할 수 있습니다. 그런 다음 다음 단계에서 다른 절반을 버리는 식입니다."
"환상적이야! 목표를 향해 매우 빠르게 직진한다!"
"맞아요. 100만(!) 요소의 배열에서 이진 검색 알고리즘은 단 20번의 비교만으로 원하는 요소의 인덱스를 찾을 수 있습니다. 알고리즘의 단점은 배열을 먼저 정렬해야 하고 정렬에도 시간이 걸린다는 것입니다.
다음과 같이 호출합니다.
int index = Arrays.binarySearch(name, value);
"여기서 name
배열의 이름은 이미 정렬된 상태로 전달되어야 합니다(예: 메서드 사용 Arrays.sort()
). 그리고 value
배열에서 검색 중인 요소입니다. 메서드에서 반환된 결과는 원하는 배열 요소의 인덱스 입니다. .
예:
|
x is {-20, -20, -20, -2, 0, 3, 8, 11, 99, 999} 4 1 (인덱스 0 및 2 허용 가능)8 -7 |
"원하는 요소가 배열에 여러 번 나타나면 어떻게 됩니까 ?"
"그건 유효한 질문입니다, 아미고. 이 경우 알고리즘은 그 중 하나의 인덱스를 반환할 것입니다. ."
"배열에 원하는 요소가 전혀 포함되어 있지 않으면 어떻게 됩니까?"
"이 경우 알고리즘은 음수 인덱스를 반환합니다 .
선적 서류 비치
"모든 것이 명확해, Rishi! 이것은 매우 흥미로웠다."
"이 내용이 정말 흥미로웠다면 여가 시간에 Oracle 웹 사이트Arrays
에서 해당 클래스 및 해당 메서드 에 대한 공식 문서를 훑어보십시오 .
Arrays.mismatch()
"예를 들어 및 방법을 자세히 살펴볼 수 있습니다 Arrays.compare()
. 아마 잘 활용할 수 있을 것입니다.
"그리고 방법의 수로 혼동하지 마십시오. 각 방법에는 매개 변수 유형만 다른 5-10개의 변형이 있습니다."
GO TO FULL VERSION