"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의 좋은(또는 나쁜) 오래된 전통에 따라 마지막 요소는 범위에 포함되지 않는다는 점을 기억하십시오.

예:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

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()

"아미고, 어레이가 생성된 후 어레이의 크기를 변경하는 방법을 알려주세요."

"음... 그건 속임수 질문이죠? 저는 더 이상 경험이 부족하지 않습니다. 정답은 할 수 없다는 것입니다! 배열이 생성된 후에는 크기를 조정할 수 없습니다."

"하지만 정말로 원한다면?"

"그래도 불가능해!

"실제로, 정말로 원한다면 할 수 있습니다! 프로그래밍 트릭의 도움으로:

  1. 먼저 원하는 길이의 새 배열을 만듭니다.
  2. 그런 다음 첫 번째 배열의 모든 요소를 ​​여기에 복사합니다.

"메소드가 수행하는 두 가지 작업입니다 Arrays.copyOf(). 다음과 같이 호출합니다.

Type[] name2 = Arrays.copyOf(name, length);

"이 방법은 기존 배열을 변경하지 않고 대신 새 배열을 만들고 이전 배열의 요소를 복사합니다."

" 새 어레이의 길이가 기존 어레이의 길이 보다 작으면 어떻게 됩니까 ?

"좋은 질문입니다, 아미고! 요소가 맞지 않으면 추가 값은 무시됩니다."

"그리고 반대로 여분의 셀이 있다면, 그들의 초기 값은 무엇입니까?

"새 배열의 길이가 이전 배열의 길이보다 크면 셀이 0으로 채워집니다.

예:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


변수 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);

"이 방법도 새 배열을 생성하지만 원래 배열의 임의 위치에 있는 요소로 배열을 채웁니다. 여기서 첫 번째마지막 은 새 배열에 넣어야 하는 첫 번째 요소와 마지막 요소의 인덱스입니다. 마지막 요소가 이 범위에 포함됩니까?"

"하! 나의 위대한 스승이 ' 자바의 좋은(혹은 나쁜) 오래된 전통에 따라, 마지막 요소가 범위에 포함되지 않는다는 것을 기억하라 ' 라고 말하곤 했습니다 ."

"아미고, 당신은 우리 눈앞에서 자라고 있습니다.

예:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


변수 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);

이 메서드는 전달된 배열을 오름차순으로 정렬합니다.

예:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


변수 는 str값을 포함합니다
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"훌륭합니다! 메서드를 하나만 호출했는데 배열이 정렬되었습니다. 정말 아름답습니다!"

"그런데 전체 배열뿐만 아니라 일부만 정렬할 수도 있습니다. 다음과 같이 호출합니다.

Arrays.sort(name, first, last);

"여기서 첫 번째마지막 은 정렬이 터치해야 하는 첫 번째와 마지막 셀의 인덱스입니다. 그리고...

"무슨 말을 하려는지 이미 알고 있습니다! 'Java의 좋은(또는 나쁜) 오래된 전통에 따라 마지막 요소가 범위에 포함되지 않는다는 점을 기억하세요.' .

예:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


변수 는 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배열에서 검색 중인 요소입니다. 메서드에서 반환된 결과는 원하는 배열 요소의 인덱스 입니다. .

예:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xis
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(인덱스 02허용 가능)
8
-7

"원하는 요소가 배열에 여러 번 나타나면 어떻게 됩니까 ?"

"그건 유효한 질문입니다, 아미고. 이 경우 알고리즘은 그 중 하나의 인덱스를 반환할 것입니다. ."

"배열에 원하는 요소가 전혀 포함되어 있지 않으면 어떻게 됩니까?"

"이 경우 알고리즘은 음수 인덱스를 반환합니다 .

선적 서류 비치

"모든 것이 명확해, Rishi! 이것은 매우 흥미로웠다."

"이 내용이 정말 흥미로웠다면 여가 시간에 Oracle 웹 사이트Arrays 에서 해당 클래스 및 해당 메서드 에 대한 공식 문서를 훑어보십시오 .

Arrays.mismatch()"예를 들어 및 방법을 자세히 살펴볼 수 있습니다 Arrays.compare(). 아마 잘 활용할 수 있을 것입니다.

"그리고 방법의 수로 혼동하지 마십시오. 각 방법에는 매개 변수 유형만 다른 ​​5-10개의 변형이 있습니다."