Arrays

Java Collections
7 уровень , 7 лекция
Открыта

— Привет, Амиго!

Как прошли утренние лекции?

— Да прилично так, я тебе скажу.

Билаабо дал кучу паттернов проектирования, Элли кучу всего по коллекциям. Непростой выдался денек.

— Ничего, зато я тебя сильно ничем нагружать не стану.

Хочу рассказать тебе про два утилитных класса, с которыми ты уже сталкивался.

Это классы Arrays и Collections. Все их методы статические и предназначены для работы с коллекциями и массивами.

Начну с более простого – Arrays. Вот его методы:

Методы Пояснение
List<T> asList(T... a)
Возвращает неизменяемый список, заполненный переданными элементами.
int binarySearch(int[] a, int fromIndex, int toIndex, int key)
Ищет элемент (key) в массиве a или подмассиве, начиная с fromIndex и до toIndex.
Массив должен быть отсортирован!
Возвращает номер элемента или fromIndex-1, если элемент не найдет.
int[] copyOf(int[] original, int newLength)
Возвращает подмассив original массива, newLength элементов, начиная с нулевого.
int[] copyOfRange(int[] original, int from, int to)
Возвращает под массив original массива, начиная с from и до to.
boolean deepEquals(Object[] a1, Object[] a2)
Глубокое сравнение массивов. Массивы считаются равными, если равны их элементы. Если элементы сами являются массивами, для них тоже выполняется глубокое сравнение.
int deepHashCode(Object a[])
Глубокий хэшкод на основе всех элементов. Если элемент является массивом, для него также вызывается deepHashCode.
String deepToString(Object[] a)
Глубокое преобразование к строке. Для всех элементов вызывается toString(). Если элемент является массивом, для него тоже выполняется глубокое преобразование к строке.
boolean equals(int[] a, int[] a2)
Сравнивает два массива поэлементно.
void fill(int[] a, int fromIndex, int toIndex, int val)
Заполняет массив (или подмассив) заданным значением.
int hashCode(int a[])
Вычисляет общий hashCode всех элементов массива.
void sort(int[] a, int fromIndex, int toIndex)
Сортирует массив (или подмассив) по возрастанию.
String toString(int[] a)
Преобразовывает массив к строке. Для всех элементов вызывается toString();

— А что, очень полезные методы, многие мне бы пригодились.

— Хочу еще заметить, что я тут привел не все методы. Почти все методы из таблицы дублируются для всех примитивных типов. Т.е. если написано String toString(int[] a), то также есть методы String toString(boolean[] a), String toString(byte[] a), String toString(long[] a), String toString(float[] a), String toString(double[] a), String toString(char[] a).

— Так это же меняет дело. Теперь это просто незаменимый класс.

— Рад, что тебе понравилось. Тогда продолжим после перерыва.

Комментарии (21)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Нейросеть Уровень 41
24 августа 2023
Этим мы весь курс пользовались, так что лекция проходная на мой взгляд даже для повтора
Igor Petrashevsky Уровень 47
27 августа 2022
было в первом квесте, снова 27 в топку
Anonymous #2413783 Уровень 36
17 декабря 2020
почему-то ранее не обращал на это внимание, может для кого-то будет новой такая деталь: Разница между Arrays.asList (массив) и новым ArrayList <Integer> (Arrays.asList (массив))
LuneFox Уровень 41 Expert
28 февраля 2022
Каким-то странным языком задан вопрос и написан ответ, очень напоминает машинный перевод.
ram0973 Уровень 41
19 августа 2020
Интересно за преподавателями стоят реальные люди? 😀
Zlata Уровень 49
30 апреля 2022
да Бобров это Бранниган
hidden #1281202 Уровень 41
10 августа 2019
Что такое бинарный поиск? Этот вид поиска использует подход «Разделяй и властвуй», требует предварительной сортировки набора данных. Алгоритм делит входную коллекцию на равные половины, и с каждой итерацией сравнивает целевой элемент с элементом в середине. Поиск заканчивается при нахождении элемента. Иначе продолжаем искать элемент, разделяя и выбирая соответствующий раздел массива. Целевой элемент сравнивается со средним. Вот почему важно иметь отсортированную коллекцию при использовании двоичного поиска. Визуализация бинарного поиска в сравнении с обычным линейным:
11 августа 2019
Я одного не понимаю, почему все так любят применять это сраное понятие алгоритм "разделяй и властвуй", неужели это проще и понятнее, чем называть его рекурсивным или разбиением. Не знаю почему, но меня прям коробит, когда используют этот термин. "Разделяй и властвуй" властелины блин. Один переводчик криво перевел, теперь, каждый везде использует этот термин, приехали, мать вашу.
11 августа 2019
И он не требует предварительной сортировки, это не правильная формулировка. Бинарный поиск требует того, что бы входные данные были отсортированы или должны иметь соответствующую структуру (например, бинарное дерево). Просто, если перед каждым запуском бинарного поиска сортировать входной массив, мы получим менее эффективный алгоритм, чем линейный поиск. О(n) для линейного поиска = n O(n) сортировки (для сортировки слиянием) = nlog(n) O(n) бинарного поиска = log(n) O(n) бинарного поиска и сортировки слиянием = nlog(n)+log(n) (но так как при вычислении верхней границы мы можем пренебречь более низким порядком, можно считать, что бинарный поиск + сортировка имеют O(n) = nlog(n), по наибольшему порядку роста) n < nlog(n) => линейный поиск эффективнее сортировки + бинарный поиск
hidden #1281202 Уровень 41
11 августа 2019
Походу этот переводчик криво перевёл: wiki Если в вики нажать на english версию, то оригинальное название алгоритма выглядит как: "Divide-and-conquer". Интересно, каков будет наиболее точный дословный перевод на русский язык? Что бы узнать, прошу перейти назад на русскую версию вики. Насчёт бинарного поиска. И так известно, что если мы знаем, что наши данные отсортированы, то не нужно запускать сортировку, так как это не имеет смысла и никакой идиот не будет этим заниматься - это очевидно.
11 августа 2019
а что делать если входные данные не отсортированные или мы не знаем, что отсортированы они или нет?
11 августа 2019
Тут дело не в очевидности, а в том, какие ограничения и как накладываются на входные данные. Если данные не отсортированы, то либо эффективнее применить линейный поиск, либо изменить структуру входных данных. Но ни как не сортировать предварительно дабы применить бинарный поиск. Вот я о чем.
11 августа 2019
А про разделяй и властвуй, это так, меня просто очень напрягает этот термин, не знаю почему. А на счет того, что в английской версии используется "Divide-and-conquer", так далеко не всегда дословно переводить правильно. Переведи любой абзац английского текста дословно, любого, получится ересь. Но в любом случае, это разговор в пользу бедных и просто мое субъективное мнение на использование термина. Кто бы какой термин не использовал, Разделяй и властвуй или разбиение или рекурсивный, собеседник вполне поймет о чем речь)))
Валентин Уровень 35
30 сентября 2019
Это все Цезарь виноват. Он пропиарил "разделяй и властвуй". Не умер бы Атилла так рано было бы "порви и трахни". Эхехх...
Igor Petrashevsky Уровень 47
27 августа 2022
метод половинного деления он звался в 60х. правда для обычных задач на множествах
Ilya Sakharov Уровень 41
23 октября 2018
Не понятна разница между deepEquals, deepToString и обычными методами. А там и там для каждого элемента массива..
11 августа 2019
в том, что toString вложенные массивы не преобразует к строке, а deepToString преобразует и вложенные массивы.

        int[][] matr = {{1,2,3},{1,2,3},{1,2,3}};
        System.out.println(Arrays.toString(matr));
        System.out.println(Arrays.deepToString(matr));
вывод

[[I@3feba861, [I@5b480cf9, [I@6f496d9f]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
swen922 Уровень 1
15 июля 2018
В binarySearch ключевая фраза "Массив должен быть отсортирован!" А то крутишь массив и не понимаешь: JVM с ума сошла или сам тронулся: не обнаруживает значения, хотя они там точно есть. А сортировочку-то не сделал!
Anonymous #1013756 Уровень 40
4 декабря 2018
Вообще логично, поскольку двоичный поиск предполагает, что нам на вход подают отсортированный массив - там потому и сложность оценивается в O(logN), а не O(N), как в линейном (где надо прочесывать с самого начала). Если кто еще не смотрел - CS50 первая лекция, с 17-й минуты примерно.
18 сентября 2017
Метод ListasList(T... a) превращается в asList(T... a).
Vitya Уровень 33
12 июля 2017
В binarySearch не всё так просто. Если элемент не найден, возвращает величину (-i-1), где i — это индекс элемента, после которого нужно вставить искомый элемент для того, чтобы сохранился порядок сортировки. Отрицание для того, что бы если элемент не найден, результат был меньше ноля.