„Риши, наистина очаквам с нетърпение да науча за останалите методи на класа Arrays.

"Такова усърдие за учене не може да не угоди на стария ви учител! Но ако наистина искате да разберете всичко, един мил магьосник на име Гугъл ще ви помага ден и нощ."

"Ъъъ..."

„Само се шегувам. Един вид. Разбира се, ще обясня всичко по-добре, но ако изникне нещо – спомнете си добрия магьосник. Ще започна днешния урок с Arrays.fillметода

„Когато работят с масиви, Java програмистите много често трябва да запълнят масива с една и съща стойност. Можете, разбира се, да напишете цикъл и просто да присвоите няHowва стойност на всяка клетка от масива в цикъла:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

„Или instead of всичко това, можете да извикате Arrays.fill()метода, който прави абсолютно същото: запълва предадения масив с предадената стойност. Ето How изглежда:

Arrays.fill(name, value)

И codeът в примера по-горе може да бъде напequals малко по-компактен и по-ясен:

int[] x = new int[100];
Arrays.fill(x, 999);

"Красив!"

„Можете също да използвате Arrays.fill()метода, за да попълните не целия масив, а част от него с няHowва стойност:

Arrays.fill(name, first, last, value)

„Където първи и последен са индексите на първата и последната клетка, които трябва да бъдат попълнени.

" В съответствие с добрата (or лоша) стара традиция на 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. Клетките на масива се номерират от нула!

Променливата strсъдържа стойността
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

Arrays.fill()Методът работи само с едномерни масиви. Ако подадете двумерен масив към метода, той ще бъде третиран като едномерен с всички произтичащи от това последствия.

Arrays.copyOf()

„Амиго, моля, кажи ми How да променя размера на масив, след като е създаден?“

„Ъмм... Това е триков въпрос, нали? Вече не съм толкова неопитен. Правилният отговор е, че не можете! Не можете да промените размера на масив, след като е бил създаден.“

— Но Howво, ако наистина го искаш?

„Все още е невъзможно!

„Всъщност, ако наистина искате, тогава можете! С помощта на програмен трик:

  1. Първо създавате нов масив с желаната дължина
  2. След това копирате всички елементи от първия масив в него.

„Това са двете неща, които Arrays.copyOf()прави методът. Ето How изглежда извикването му:

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

„Този ​​метод не променя съществуващия масив , а instead of това създава нов масив и копира елементите на стария масив в него.“

„Ами ако дължината на новия масив е по-малка от дължината на съществуващия ?

"Страхотен въпрос, Амиго! Ако елементите не пасват, допълнителните стойности просто се игнорират."

„А ако, напротив, има излишни клетки, Howви са първоначалните им стойности?

„Ако дължината на новия масив е по-голяма от дължината на стария, клетките се запълват с нули.

Пример:

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

„И Howво, ако искате да получите масив с дължина 5 от масив с дължина 10, но имате нужда той да съдържа последните 5 елемента, а не първите 5? В този случай имате нужда от друг метод на класа. Това Arraysе Arrays.copyOfRange()Ето How изглежда извикването:

Type[] name2 = Arrays.copyOfRange(name, first, last);

„Този ​​метод също създава нов масив, но го запълва с елементи от произволно място в оригиналния масив. Където първи и последен са индексите на първия и последния елемент, които трябва да бъдат поставени в новия масив. Можете ли да ми кажете дали последният елемент е включен в този диапазон?"

„Ха! Както казваше моят велик учител, „ в съответствие с добрата (or лошата) стара традиция на Java, запомнете, че последният елемент не е включен в диапазона “.

„Амиго, ти растеш точно пред очите ни.

Пример:

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 на най-популярните действия при работа с масиви:

  • Сортиране на масив
  • Намиране на минималния (or максималния) елемент на масив
  • Определяне на индекса на елемент в масив (намиране на елемент в масив)

„Добре работещите алгоритми за сортиране, трябва да кажа, не са толкова лесни за писане. По-точно, това е стандартна задача и като студент няма да ви навреди понякога да практикувате писането на алгоритми за сортиране. Но на работа е по-добре не си губете времето да преоткривате колелото. Създателите на Java са включor метода sort()в Arraysкласа. Ето How изглежда извикването му:

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]"

"Отлично! Извиках само един метод и масивът е сортиран. Нещо красиво!"

„Между другото, можете да сортирате не само целия масив, но и само част от него. Ето How изглежда извикването му:

Arrays.sort(name, first, last);

„Където първи и последен са индексите на първата и последната клетка, които сортирането трябва да докосне. И...

„Вече знам Howво ще кажете! „В съответствие с добрата (or лошата) стара традиция на 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 сравнения на елементи от масив. Сортирането на масив от един мorон елемента ще включва около 20 мorона сравнения."

Не много сравнения, когато вземете предвид броя на елементите!“

„Точно това казвам. Алгоритъмът QuickSort е много ефективен.

Arrays.binarySearch()

„Е, и последният от най-интересните методи на Arraysкласа е в състояние да търси дадена стойност в масив. Това не е обикновено търсене – това е любимото двоично търсене . Свежда се до следното:

  • Първо, масивът се сортира.
  • След това средният елемент на масива се сравнява с този, който търсим.
  • Ако елементът е по-голям от средния елемент, тогава търсенето продължава в дясната половина на масива.
  • Ако елементът, който търсим, е по-малък от средния елемент, тогава търсенето продължава в лявата половина на масива.

„Тъй като масивът е сортиран, възможно е да елиминираме половината от него в едно сравнение. След това в следващата стъпка изхвърляме друга половина и т.н.“

"Фантастично! Придвижваме се право към целта много бързо!"

„Точно така. В масив от един мorон (!) елемента, алгоритъмът за двоично търсене може да намери индекса на желания елемент само за 20 сравнения. Недостатъкът на алгоритъма е, че масивът първо трябва да бъде сортиран, а сортирането също отнема време.

Ето How изглежда извикването:

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);
xе
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(индекси 0и 2също са приемливи)
8
-7

„Ами ако желаният елемент се появи няколко пъти в масива ?“

„Това е валиден въпрос, Амиго. В този случай алгоритъмът ще върне индекса на един от тях (няма гаранция, че ще бъде, да речем, първият or обратното – последният от тези дублирани елементи) ."

„Ами ако масивът изобщо не съдържа желания елемент?“

„В този случай алгоритъмът ще върне отрицателен индекс .

Документация

„Всичко е ясно, Риши! Беше много интересно.“

„Ако наистина сте намерor това за много интересно, тогава в свободното си време прегледайте набързо официалната documentация на Arraysкласа и неговите методи на уебсайта на Oracle .

„Можете да разгледате по-отблизо, например, методите Arrays.mismatch()и Arrays.compare(). Най-вероятно ще можете да ги използвате добре.

„И не се бъркайте от броя на методите. Всеки метод има 5-10 варианта, които се различават само по своите типове параметри.“