Java — Java Вопрос по массивам.


Содержание

Массивы данных

Массив (array) это объект, хранящий в себе фиксированное количество значений одного типа. Другими словами, массив — это нумерованный набор переменных. Переменная в массиве называется элементом массива, а ее позиция в массиве задается индексом. Если, к примеру, нужно хранить большой объем различных имен, то неудобно для каждого имени создавать отдельную переменную. В этом случае следует использовать массив данных.

Для наглядности приведена картинка с The Java Tutorial.

Индекс начального элемента массива данных равен 0, следующего за ним — 1 и т.д. Индекс последнего элемента в массиве — на единицу меньше размера массива.

В Java массивы данных являются объектами. Это значит, что имя, которое даётся каждому массиву, лишь указывает на адрес какого-то фрагмента данных в памяти. Кроме адреса в этой переменной ничего не хранится. Индекс массива, фактически, указывает на то, насколько надо отступить от начального элемента массива в памяти, чтобы получить доступ к нужному элементу.

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

Объявление массива

При создании массива первым делом его нужно объявить. Пример объявления массива данных целочисленных значений :

Массив данных можно объявить и так :

Однако, это не приветствуется соглашением по оформлению кода в Java. Поскольку квадратные скобки обозначают то, что мы имеем дело с массивом данных, то логичнее, чтобы они находились рядом с обозначением типа.

В приведенных выше примерах было объявлено 2 массива с именами firstArray и secondArray. Оба массива содержат элементы типа int.

Подобным образом можно объявить массив любого типа. Пример объявления массива :

Тип массива задается как type[], где type это тип данных содержащихся в нем элементов. Скобки являются специальным обозначением того, что переменные содержатся в массиве. Имя массива может быль любым, однако, оно должно соответствовать правилам именования переменных.

Массивы можно создавать не только из переменных базовых типов, но и из произвольных объектов. При объявлении массива в языке Java не указывается его размер и не резервируется память для него. Происходит лишь создание ссылки на массив.

Резервирование памяти и инициализация массива

Для объявленного массива данных firstArray необходимо зарезервировть память при помощи ключевого слова new. Пример резервирования памяти :

В примере создается массив из 15 элементов типа int и присвоение его переменной firstArray. Объявлять имя массива и резервировать для него память также можно в одной строке.

При создании массива с помощью ключевого слова new, все элементы массива автоматически инициализированы нулевыми значениями. Для того, чтобы присвоить элементам массива свои начальные значения, необходимо провести его инициализацию. Инициализацию можно проводить поэлементно :

Также инициализацию можно проводить в цикле, с помощью индекса проходя все элементы массива и присваивая им значения.

Как видно из примеров, для того, чтобы обратиться к элементу массива, нужно указать его имя и в квадратных скобках — индекс элемента. Элемент массива с конкретным индексом ведёт себя также, как и переменная.

Для создания и инициализации массива можно также использовать упрощенную запись. Она не содержит слово new, а в скобках перечисляются начальные значения массива. Примеры объявления массивов с инициализацией :

То есть, при создании массива указается его размер, либо сразу перечисляются через запятую все желаемые элементы в фигурных скобках (при этом размер будет вычислен автоматически на основе той последовательности элементов, которая будет указана). После закрывающей фигурной скобки ставится точка с запятой, чего не бывает когда это скобка закрывает какой-то блок кода.

Длину любого созданного массива запоминать не обязательно, т.к. имеется свойство, которое его хранит. Обратиться к этому свойству можно дописав .length к имени массива. Например:

Это свойство нельзя изменять, его можно только читать. Используя это свойство можно писать программный код для обработки массива даже не зная его конкретного размера. Например, так можно вывести на экран элементы любого массива с именем ar2 :

Последний элемент массива всегда ar2[ar2.length — 1].

Если программа выйдет за пределы индекса массива, то она будет остановлена с ошибкой ArrayOutOfBoundsException.

Многомерные массивы

Массив может состоять не только из элементов какого-то встроенного типа (int, double и пр.), но и, в том числе, из объектов какого-то существующего класса и даже из других массивов. Массив который в качестве своих элементов содержит другие массивы называется многомерным массивом.

Чаще всего используются двумерные массивы. Такие массивы можно легко представить в виде матрицы. Каждая строка которой является обычным одномерным массивом, а объединение всех строк — двумерным массивом в каждом элементе которого хранится ссылка на какую-то строку матрицы.

Трёхмерный массив можно представить себе как набор матриц, каждую из которых мы записали на библиотечной карточке. Тогда чтобы добраться до конкретного числа сначала нужно указать номер карточки (первый индекс трёхмерного массива), потом указать номер строки (второй индекс массива) и только затем номер элемент в строке (третий индекс).

Соответственно, для того, чтобы обратиться к элементу n-мерного массива нужно указать n индексов.

При создании массива можно указать явно размер каждого его уровня :

Но можно указать только размер первого уровня:

В последнем случае, можно создать двумерный массив, который не будет являться матрицей из-за того, что в каждой его строке будет разное количество элементов. Например:

В результате получим массив следующего вида:

Можно создать массив явно указав его элементы. Например :

При этом можно обратиться к элементу с индексом 4 во второй строке ddd2[1][4]. Но если мы обратимся к элементу ddd2[0][4] или ddd2[2][4] — произойдёт ошибка, поскольку таких элементов просто нет. При этом ошибка будет возникать во время исполнения программы, т. е. компилятор её не увидит.

Обычно всё же используются двумерные массивы с равным количеством элементов в каждой строке. Для обработки двумерных массивов используются два вложенных друг в друга цикла с разными счётчиками. Пример заполнения двумерного массива случайными числами от 0 до 9 и вывод его в консоль в виде матрицы:

Копирование массива arraycopy

Стандартная библиотека Java содержит статический метод System.arraycopy(), который копирует массивы значительнее быстрее, чем при ручном копировании в цикле for. В аргументах arraycopy() передается исходный массив, начальная позиция копирования в исходном массиве, приёмный массив, начальная позиция копирования в приёмном массиве и количество копируемых элементов. Любое нарушение границ массива приведет к исключению.

Разработчик Avi Yehuda написал программу, которая вычисляет время на копирование с помощью цикла for и с помощью метода arraycopy() на примере с миллионом элементов. Ручное копирование у него заняло 182 мс, с помощью метода arraycopy() — 12 мс. Разница очевидна невооруженным глазом.

Массивы в Java. Одномерные и многомерные.

Начнем, пожалуй, последнюю не очень приятную и интересную, но очень важную и полезную тему в теории языка Java — массивы. Далее будет более интересный и увлекательный материал, который можно будет использовать для более практичных задач. Но, чтобы начать интересную часть явы нужно выучить неинтересную)) которая и является основой языка и без которой невозможно дальше учить программирование.

Все предыдущие темы, который мы рассматривали: Условные операторы, циклы являются основами программирования. С их изучения Вы будете начинать любой другой язык программирования. Массивы тоже относятся к такой теме. На чем бы Вы не решили начать программировать, Вы вряд ли сможете обойтись без массивов. Поэтому, я советую очень хорошо освоить данный и прошлый материал, если Вы хотите преуспеть в программировании.

Теперь перейдем к массивам.

Массив — это структура данных, которая предназначена для хранения однотипных данных.

Допустим, Вам нужно создать 5 целочисленных переменных и задать им некоторое значение. Как Вы это будете делать? Не зная массивов, Вы скорее всего начнете писать вот так: int a = 2, b = 3, c = 5, d = 21, e = 2;

Имея в арсенале такой тип данных как массивы, Вы можете писать так: int a = <2, 3, 5, 21, 2>;

Это очень удобно, когда имеет место обработка этих данных. Например, теперь Вам нужно к каждой переменной добавить 3. Если бы Вы использовали первый способ объявления, то такая операция заняла бы у Вас достаточно много времени. Тогда как имея в арсенале массивы и циклы, мы можем обрабатывать огромное количество данных не прибегая к монотонному коду.

Перед тем как использовать, массив нужно:

Запомните это порядок действий и никогда не нарушайте его.
Объявление массивов:
char s[];
String p[];
или
char [] s;
String [] p;
Создание массивов:
s = new char[20];
p = new String[100];

В квадратных скобках указано количество элементов массива. Это количество нельзя будет поменять потом.
Инициализация массивов:
после создания – поэлементно: int[] a = <1,2,3,4,5>;
при объявлении/создании – массив целиком: int b[] = new int[] <2, 4 ,6>;.

Если массив явно не проинициализирован, то после его создания все
элементы равны:
0 – в числовых массивах
false – в boolean-массивах
null – в массивах объектов

Границы массивов:
У всех массивов есть поле length – длина массива (в элементах)
Первый элемент всегда имеет индекс 0 (не путать со значением).
Последний элемент всегда имеет индекс length-1.

После такого количества теории, думаю, нужно немного практики:

Вопросы по массиву Java

Так что это просто основной вопрос. Я работал с массивами в Java, понял, что мне нужно сделать для моего небольшого задания. Я решил поиграть с массивом и посмотреть, что произойдет, если я распечатаю свой массив. Я был очень смущен результатом, который я получил с этим кодом:

Таким образом, первоначальная цель заключалась в том, чтобы просто создать массив «0, 2, 4, 6, 8». Я решил поместить свой System.out.print вне цикла for и распечатать его. Вывод, который я получил, был

На самом деле, когда я писал это, я думал, что вместо цифр 0-9 вместо цифр 0-9 ставится «0», например, 0 — «ложь», и если число показывает, что оно находится в массиве, то я не уверен.

Если бы кто-нибудь мог объяснить мне, если это то, что здесь происходит, и, возможно, объяснить, как напечатать значения массива вне цикла for, я был бы очень признателен

6 ответов

Вы увеличиваете p дважды на каждой итерации:

Удалите p++ из тела цикла.

Если вы хотите, чтобы массив содержал 0, 2, 4, 6, . тело цикла должно быть

т.е. инициализировать каждый элемент массива с его положением, умноженным на 2.


Вы увеличиваете p дважды в каждой итерации цикла for .
Поэтому присваиваются только четные индексы массива (0,2,4,6,8).

Если вы удалите один из них (имеет смысл удалить второй p++ ), он будет работать как положено.

Кстати, если цель состоит в том, чтобы присваивать массиву только четные значения, вы должны назначить 2*p .

Ваша проблема в том, что вы увеличиваете переменную цикла p два раза: один раз в обычный цикл for и второй раз в конце цикла for — поэтому ваш индекс пропускает каждые два шага, а пропущенные элементы массива не заполняются вообще ,

Решение состоит в том, чтобы выполнить итерацию в обычном порядке, но поместить индекс * 2 в текущую позицию массива:

Привет Ничего страшного, когда вы объявили массив вроде:

Он получил инициализированный ‘0’ во всех индексах, начиная с 0 до 9;

когда вы вводите значение, оно вставляется в:

А так как во всем остальном значение индекса уже равно «0». Итак, если вы напечатаете массив, он будет печататься так:

Если вы хотите напечатать массив, просто запустите цикл for и напечатайте как:

По умолчанию тип данных int инициализируется значением 0. Так как вы увеличиваете p дважды (один раз в цикле for, один раз в теле цикла), только элементы с четными индексами могут изменить свое значение.

Таким образом, в первой итерации вы получаете anArray [0] = 0. Затем вы увеличиваете p дважды, так что во второй итерации p равно 2, и вы делаете anArray [2] = 2, тогда как anArray [1] был пропущен.

Я рекомендую взглянуть на спецификацию языка Java

Компоненты массива — это неназванные переменные, которые создаются и инициализируются значениями по умолчанию (§4.12.5) всякий раз, когда создается новый объект, являющийся массивом (§10, §15.10). Компоненты массива фактически перестают существовать, когда на массив больше нет ссылок.

В вашем случае вы используете int и они по умолчанию инициализируются на 0.

Вот причина, по которой вы получаете: [0, 0, 2, 0, 4, 0, 6, 0, 8, 0], поскольку «пропущенные» значения фактически просто не изменяются по сравнению со значением по умолчанию. 2 4 6 8 — потому что вы увеличиваете p дважды, но я не уверен, что это из-за замысла или это ошибка, так как ваш первоначальный вопрос, кажется, указывает на первое.

Цукерберг рекомендует:  Красивое портфолио с помощью jQuery

И если вы просто хотите, чтобы он содержал: 0 2 4 6 8 Вы можете использовать следующий код:

Нет смысла инициализировать массив размером 10, если вы хотите, чтобы он содержал только 5 элементов.

Java — Java Вопрос по массивам.

Массив (англ. Array) это объект, хранящий в себе фиксированное количество значений одного типа. Другими словами, массив — это нумерованный набор переменных. Переменная в массиве называется элементом массива, а ее позиция в массиве задается индексом. Например, нам нужно хранить 50 различных имен, согласитесь, неудобно для каждого имени создавать отдельную переменную, поэтому мы будем использовать массив. Нумерация элементов массива начинается с 0, а длинна массива устанавливается в момент его создания и фиксируется.

Для наглядности картинка, взятая мною с The Java Tutorial.

Для того чтобы создать массив нужно его объявить, зарезервировать для него память и инициализировать.

Объявление массива в Java

При создании массива в Java первым делом его нужно объявить. Это можно сделать следующим образом:

Можно также объявить массив так:

Однако, это не приветствуется соглашением по оформлению кода в Java, поскольку скобки обозначают то, что мы имеем дело с массивом и логичнее, когда они находятся рядом с обозначением типа.

Исходя из данного примера, мы объявили 2 массива с именами myFirstArray и mySecondArray. Оба массива будут содержать элементы типа int.

Подобным образом можно объявить массив любого типа:

Тип массива задается следующим образом type[], где type это тип данных содержащихся в нем элементов. Скобки являются специальным обозначением того, что переменные содержатся в массиве. Имя массива может быль любым, однако, оно должно соответствовать правилам именования переменных.

Массивы можно создавать не только из переменных базовых типов, но и из произвольных объектов.

При объявлении массива в языке Java не указывается его размер и не резервируется память для него. Происходит лишь создание ссылки на массив.

Резервация памяти для массива и его инициализация.

Далее, для объявленного myFirstArray, зарезервируем память при помощи ключевого слова new.

В нашем примере мы создали массив из 15 элементов типа int и присвоили его ранее объявленной переменной myFirstArray.

Объявлять имя массива и резервировать для него память также можно на одной строке.

При создании массива с помощью ключевого слова new, все элементы массива автоматически инициализированы нулевыми значениями. Для того, чтобы присвоить элементам массива свои начальные значения, необходимо провести его инициализацию. Инициализацию можно проводить как поэлементно

так и в цикле, с помощью индекса проходя все элементы массива и присваивая им значения.

Как видно из предыдущих примеров, для того, чтобы обратиться к элементу массива, нужно указать его имя и, затем, в квадратных скобках — индекс элемента. Элемент массива с конкретным индексом ведёт себя также, как и переменная.

Рассмотрим создание и инициализацию массива на следующем примере. В нем мы создаем массив, содержащий цифры 0-9 и выводим значения на консоль.

Упрощенная форма записи

Для создания и инициализации массива можно также использовать упрощенную запись. Она не содержит слово new, а в скобках перечисляются начальные значения массива.

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

Определение размера массива

Размер массива не всегда очевиден, поэтому для того, чтобы его узнать следует использовать свойство length, которое возвращает длину массива.

Данный код поможет нам узнать, что длина массива myColor равна 3.

Пример: Задано 4 числа, необходимо найти минимальное

ТОП 20 тестовых заданий на интервью для Java разработчика

В этой статье мы приведем достаточно большое количество примеров программ из тех, что просят написать соискателей во время прохождения интервью на вакансию Java разработчика. Указанные тестовые задания мы приводим с реальными примерами кода, заданными в интервью как начинающих, так и достаточно опытных кандидатов.

На сегодня среди интервьюеров стало обычной практикой давать тестовые практические задания во время интервью, не фокусируясь только на теоретических вопросах. Такие задачи обычно задаются на техническом этапе интервью Java разработчика.

Для того, чтобы помочь соискателям подходящих вакансий пройти такие интервью, мы хотим перечислить несколько очень важных примеров программ на Java вместе с надлежащим описанием каждого.

Кроме того, мы также добавляем соответствующие пояснения кода. Эти пояснения дадут вам четкое представление о том, как работает каждая программа.

Самые популярные вопросы интервью Java-программирования.

Q # 1) Напишите программу на Java для переворачивания строки, изменив расположение символов в строке задом наперёд без использования встроенных в String функций.

Ответ:

Для начала инициализируем строковую переменную st и используем класс StringBuilder.

Объект класса StringBuilder strB будет в дальнейшем использоваться для добавления значения, хранящегося в строковой переменной st.

После этого мы используем встроенную в StringBuilder функцию reverse() и сохраняем новую — обращенную строку в stB.

Наконец, мы выводим на экран stB.

public static void main(String[] args) <

// ITVDN.com 1 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st = «Задача1»;

StringBuilder stB = new StringBuilder();

stB = stB.reverse(); // используем StringBuilder для переворота строки

На экране получим:

Q # 2) Напишите программу на Java для переворота последовательности символов в строке без использования встроенной в String функции reverse().


Ответ

Способ 1:

Есть несколько способов, с помощью которых вы можете перевернуть вашу строку, если вам разрешено использовать другие встроенные функции строки.

В этом способе мы инициализируем строковую переменную с именем st значением заданной строки. Затем мы конвертируем эту строку в массив символов с помощью функции toCharArray(). После этого мы используем цикл for чтобы взять все символы в обратном порядке и вывести их так на экран поочередно.

public static void main(String[] args) <

//ITVDN.com 2 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st = «Учимся программировать»;

char symbols[] = st.toCharArray(); // конвертируем строку в массив символов, затем выводим символы на экран в обратном порядке

for(int x= symbols.length-1; x>=0; x—) <

На экране получим:

Способ 2:

Это еще один способ выполнить задачу с переворотом последовательности символов в строке. В этом способе вы объявляете строковую переменную st, а затем используете класс Scanner, объявляя объект scannerQ для работы со стандартным потоком ввода данных.

В данном случае программа примет строковое значение через командную строку (при ее выполнении).

Далее мы использовали метод nextLine(), который прочитал нашу строку при вводе ее через консоль с пробелами между словами строки. После этого мы использовали метод split() для разделения строки на ее подстроки (здесь не указывается разделитель). Затем, мы выводим строку в обратном порядке, используя цикл for.

public class SecondTask <

public static void main(String[] args) <

// ITVDN.com 2 из ТОП 20 тестовых заданий на интервью для Java разработчика

Scanner scannerQ = new Scanner(System.in);

System.out.println(«Введите вашу строку:»);

String[] temp = st.split(«»); //используем метод split для вывода строки в обратном порядке

for(int x= temp.length-1; x>=0; x—)

На экране получим:

Способ 3:

Это способ почти такой же, как способ 2, но здесь мы не используем метод split(). Мы используем класс Scanner и метод nextLine() для чтения входящей строки. Затем мы объявили целочисленную переменную stringLength, присваивая ей значение длины входящей строки.

После этого мы вывели строку в обратном порядке, используя цикл for. Однако мы использовали метод charAt(index), который будет возвращать символ по конкретному индексу. После каждой итерации символ будет добавлен в новую строку для получения перевернутого значения строковой переменной.

Затем, мы выводим переменную перевернутой строки.

public class SecondTask <

public static void main(String[] args) <

// ITVDN.com 2 из ТОП 20 тестовых заданий на интервью для Java разработчика

String mainString, reverseString = «»;

System.out.println(«Введите нужную строку, чтобы получить перевернутую:»);

Scanner scannerQ = new Scanner(System.in);

int stringLength = mainString.length();

for(int x= stringLength -1; x>=0; x—) <

reverseString = reverseString + mainString.charAt(x); //используем встроенный метод charAt() чтобы перевернуть строку

На экране получим:

Q # 3) Напишите программу на Java для того, чтобы поменять местами значения, хранящиеся в двух переменных с помощью третьей переменной

Ответ:

В этом примере мы создаем объект класса Scanner для работы со стандартным потоком ввода данных System.in. Эта программа будет принимать значения a и b через командную строку.

Мы использовали nextInt(), который будет помещать введенные пользователем значения целочисленнох переменных в a и b. Также объявляем временную переменную.

Теперь логика программы выглядит следующим образом: мы создаем временную или третью переменную с именем temp, присваиваем ей значение, хранящееся в переменной a, а затем мы присваиваем a значение b, и снова присваиваем b значение temp. Таким образом, после выполнения всех операций temp будет хранить в себе значение a, a получит значение b, а b будет иметь значение temp (которое равно a).

public class ThirdTask <

public static void main(String[] args) <

// ITVDN.com 3 из ТОП 20 тестовых заданий на интервью для Java разработчика

System.out.println(«Введите значения a и b»);

Scanner scannerQ = new Scanner(System.in);

System.out.println(«До обмена значениями » + a + b);

System.out.println(«После обмена значениями » + a + b);

На экране получим:

Q # 4) Напишите программу на Java, чтобы поменять местами значения, хранящиеся в двух переменных, без использования третьей переменной.

Ответ:

В начале все будет так же, как и в приведенном выше примере. Только дальнейшая логика изменится. Здесь мы сначала присваиваем переменной a значение a + b, что означает, что a будет теперь иметь в себе значение как a, так и b.

Затем мы присваиваем переменной b значение a — b, что означает, что мы вычитаем значение b из суммы (a + b). До сих пор a все еще хранит в себе сумму изначальных a и b. Но b имеет теперь значение первоначального a.
Наконец, на третьем шаге мы присваиваем a значение a — b, что означает, что мы вычитаем значение переменной b (которая сейчас уже имеет в себе значение a) из суммы (a + b). В результате этих действий мы поменяли местами значения, хранящиеся в переменных.

public class FourthTask

public static void main(String args[])

System.out.println(«Введите нужные значения a и b»);

Scanner scannerQ = new Scanner(System.in);

System.out.println(«До обмена значениями\na = «+a+»\nb = «+b);

System.out.println(«После обмена значениями без промежуточной переменной\na = «+a+»\nb = «+b);

На экране получим:

Q # 5) Напишите программу на Java для подсчета количества конкретных слов в строке, используя HashMap.

Ответ:

Это программа работает с классом-коллекцией, в которой мы использовали HashMap для хранения строки.

Прежде всего, мы объявили нашу строковую переменную с именем st. Затем мы использовали функцию split(), с одиночным пробелом, чтобы можно было разбить строку на массив из нескольких слов.

После этого мы создали экземпляр HashMap и цикл for. Внутри цикла for мы используем оператор if else. Мы заходим в каждый элемент массива split и добавляем элементы этого массива. Слова мы добавляем в качестве ключей экземпляра HashMap. В качестве значений HashMap мы будем добавлять то число, сколько раз при обходе массива слов нам данное слово встретилось. Если в наш экземпляр HashMap мы уже добавили данное слово – при обходе мы увеличим значение, записанное в HashMap в соответствии с данным словом-ключом.


Каждый раз, когда слово будет встречаться повторно (мы видим, что слово в экземпляр HashMap мы уже добавляли) – значение-счетчик увеличивается на 1. Если такое слово ранее не встречалось – значение-счетчик устанавливается на 1.

Наконец, мы выводим на экран HashMap.

Обратите внимание: ту же программу вы можете использовать и для подсчета количества символов в строке. Все, что вам нужно сделать, это удалить один пробел (удалить пробел, указанный в методе split) и прописать String [] words = st.split (“”);

public class FifthTask<

public static void main(String[] args) <

// ITVDN.com 5 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st = «Current task posted for Java developers developers»;

String[] words = st.split(» «);

HashMap keyValue = new HashMap ();

for (int i=0; i keyValue = new HashMap ();

keyValue.put(3, «Have a nice day!»);

Iterator iter = keyValue.entrySet().iterator();

Map.Entry qurentMe = (Map.Entry) iter.next();

System.out.println(«Ключ это » + qurentMe.getKey() + » Значение это » + qurentMe.getValue());

for(Map.Entry qurentMe2: keyValue.entrySet()) <

System.out.println(«Ключ это: » + qurentMe2.getKey() + » Значение это: » + qurentMe2.getValue());

На экране получим:

Q # 7) Напишите программу на Java, чтобы узнать, является ли число простым или нет.

Ответ:

Мы объявили две целочисленных переменных temp и number и использовали класс Scanner с nextInt (поскольку у нас может быть на рассмотрении только целое число).

Объявляем логическую переменную numberIsPrime и устанавливаем ее значение — true. После этого мы используем цикл for со значением переменной итератора, начинающемся с 2. Количество итераций, нужное нам, будет равно половине введенного числа. Счетчик итераций увеличивается на 1 после каждой итерации. В переменную tempNumber мы будем помещать остаток от деления значения введенного числа на значение счетчика. Если остаток от деления в одной из итераций будет равен 0, тогда numberIsPrime будет установлен в false, введенное число не будет простым, и мы выходим из цикла. Если во всех итерациях мы будем получать в temp некие остатки от деления, отличные от нуля – число будет простым.

Основываясь на значении numberIsPrime, мы приходим к выводу, является ли наше число простым или нет.

public class SeventhTask <

public static void main(String[] args) <

// ITVDN.com ТОП 20 тестовых заданий на интервью для Java разработчика

int temp, number;

boolean numberIsPrime = true;

Scanner scannerQ = new Scanner(System.in);

for (int x = 2; x =0; x—) <

reversedString = reversedString + inputString.charAt(x);

System.out.println(«перевернутое значение: » + reversedString);

System.out.println(«Введенное значение является палиндромом»);

System.out.println(«Введенное значение не является палиндромом»);

На экране получим:

Для строки-

Для числа-

Q # 9) Написать программу на Java для вычисления серии чисел Фибоначчи.

Ответ:

Ряд Фибоначчи — это такая серия чисел, где после первых двух чисел — каждое встречающееся число является суммой двух предыдущих чисел.

Пример: 0,1,1,2,3,5,8,13,21 ………

В этой программе мы снова использовали класс Scanner с nextInt (описывалось выше). Первоначально мы вводим (через командную строку) некое число, какое количество чисел Фибоначчи мы должны получить. Мы объявили целочисленные переменные number, x, y и z, инициализировали x и y нулем, а z — единицей. Затем мы использовали цикл for для итерации.

Процесс решения в цикле выглядит так – мы присваиваем x значение равное y (которое в первой итерации равно 0), затем y присваиваем значение переменной z (равное в первой итерации 1). Затем переменной z присваиваем значение равное сумме значений x и y.

public class NinthTask<

public static void main(String[] args) <

// ITVDN.com 9 из ТОП 20 тестовых заданий на интервью для Java разработчика

Цукерберг рекомендует:  6 инструментов для работы с CSS3

int number, x = 0, y=0, z =1;

Scanner scannerQ = new Scanner(System.in);

System.out.println(«Введите количество значений»);

System.out.println(«Серия чисел Фибоначчи: «);

for (int i=0; i linkList = curentDriver.findElements(By.tagName(«a»));

for (WebElement thisLink: linkList) <

//выводим на экран ссылку http://google.com или https://www.gmail.com

//выводим на экран текст ссылки

На экране получим:

Q # 14) Напишите код для Selenium, чтобы перейти на предыдущую вкладку.

Ответ: Мы используем класс Robot. Этот пример является достаточно важным, потому что, если вы знаете сочетания клавиш, вы можете использовать различную навигацию в браузере и его вкладках.

Например, если у вас в Chrome открыто три вкладки, и вы хотите перейти на среднюю вкладку, то вам нужно нажать + 2 на клавиатуре. То же самое можно достичь с помощью кода.

Применяйте следующий код (сразу после того, как мы увидим создание экземпляра класса Robot). Мы использовали объект qurentRobot класса Robot, с двумя встроенными методами keyPress(KeyEvenet.VK_ *) и keyRelease(KeyEvenet.VK_ *).

public class FourteenthTask<

public static void main(String[] args) throws AWTException <

// ITVDN.com 14 из ТОП 20 тестовых заданий на интервью для Java разработчика

WebDriver curentDriver = new ChromeDriver();

WebElement firstElement = curentDriver.findElement(By.name(«q»));

firstElement.sendKeys(«software testing help»);


String str = Keys.chord(Keys.CONTROL,Keys.RETURN);

curentDriver.findElement(By.partialLinkText(«Software Testing Help — A Must Visit Software Testing Portal»)).sendKeys(str);

Robot qurentRobot = new Robot(); // Инициализируем экземпляр класса Robot

qurentRobot.keyPress(KeyEvent.VK_CONTROL); // применяя класс Robot вы легко можете получить необходимый результат если вы знаете нужные комбинации кнопок

qurentRobot.keyPress(KeyEvent.VK_2); // тут мы нажимаем ctrl+2

qurentRobot.keyRelease(KeyEvent.VK_CONTROL); // как только мы нажмем и отпустим ctrl+2, мы перейдем на вторую вкладку.

qurentRobot.keyRelease(KeyEvent.VK_2); //если вы хотите снова вернуться к первой вкладке нажмите и отпустите vk_1

Q # 15) Напишите программу на Java, чтобы найти повторяющиеся символы в строке.

Ответ:

В этой программе мы создаем строковую переменную st и инициализируем целочисленный счетчик, начиная с нуля.

Затем мы создали массив символов для преобразования нашей строковой переменной в этот массив. С помощью двух циклов for мы проводим сравнение символов с разными индексами.

Если два символа последовательного индекса совпадают, то этот символ будет выведен на экран и счетчик количества совпадающих символов увеличится на 1.

public static void main(String[] args) <

// ITVDN.com 15 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st = new String(«Hello»);

char[] charsArray = st.toCharArray();

System.out.println(«Повторяющиеся символы тут:»);

for (int i=0; i biggest)

else if (numbersArray[i] > secondBiggest && numbersArray[i] != biggest)

System.out.println(«\nВторое по величине число:» + secondBiggest);

На экране получим:

Q # 17) Напишите Java-программу для проверки является ли введенное число — числом Армстронга.

Ответ:

Прежде всего, нам нужно понять, что такое число Армстронга. Число Армстронга это число, значение которого равно сумме цифр, из которых оно состоит, возведенных в степень, равную количеству цифр в этом числе. Как пример — число 371:

371 = 3*3*3 + 7*7*7 + 1*1*1 = 27 + 343 + 1 = 371

Если у вас число четырехзначное:

8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8 = 4096 + 16 + 0 + 4096 = 8208

Выполняя решение, для начала мы объявляем целочисленные переменные tempNumber, x и y. Мы инициализировали переменную y значением 0. Затем мы создаем переменную qurentNumber и присваиваем ей целочисленное значение, которое мы собираемся проверить является ли оно числом Армстронга (в нашем случае это 371). Затем мы присвоили нашей переменной tempNumber то значение, которое хранится в проверяемой переменной qurentNumber.

Далее в цикле while мы переменной a присваиваем остаток от деления числа qurentNumber на 10 – и получим число единиц в изначальном числе qurentNumber. Затем мы заменяем значение переменной qurentNumber на результат деления введенного числа на 10. Нашей переменной y, значение которой изначально было установлено как 0, присваивается результат y + (x* x * x). Таким образом во время первой итерации в y попадет результат возведения в нужную степень значения числа единиц в изначальном числе, при следующей итерации в y к степени числа единиц добавится результат возведения в степень числа десятков, и так далее по всем разрядам до конца числа qurentNumber с права налево.

Наконец, мы используем оператор if-else для проверки, будет ли полученное значение переменной y равно значению переменной tempNumber (в которой хранится исходное число). Если y = tempNumber, то загаданное число является числом Армстронга, иначе — нет.

public static void main(String[] args) <

// ITVDN.com 17 из ТОП 20 тестовых заданий на интервью для Java разработчика

int y=0, x, tempNumber;

int qurentNumber=371; //Данное число мы будем проверять на то, является ли оно числом Армстронга

x= qurentNumber %10;

qurentNumber = qurentNumber /10;

System.out.println(«Данное число является числом Армстронга»);

System.out.println(«Данное число не является числом Армстронга»);

На экране получим:

Q # 18) Напишите Java-программу для удаления всех пробелов из строки с помощью replace().

Ответ:

Это простая программа, в которой у нас есть строковая переменная st1.

Другая строковая переменная st2 инициализируется с помощью метода replaceAll, который является встроенным методом для удаления n числа пробелов. В итоге мы выводим на экран st2, которая уже не содержит пробелов.

public static void main(String[] args)

// ITVDN.com 17 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st1 = «Мы готовимся к интервью на вакансию Java разработчика»;

//Используем метод replaceAll()

String st2 = st1.replaceAll(«\\s», «»);

На экране получим:

Q # 19) Напишите Java-программу для удаления всех пробелов из строки без использования replace().

Ответ:

Это еще один подход к удалению всех пробелов. Опять же, для начала у нас есть одна строковая переменная st1 с некоторым значением. Мы преобразовываем эту строку в массив символов, используя toCharArray().

Затем у нас есть один объект StringBuffer strB, который будет использоваться для добавления значения, хранящегося по индексу chars [i] после того, как мы добавили цикл и одно условие if.

Условие установлено так, что элемент с индексом i массива символов не должен быть равен символу пробела или табуляции. Наконец, мы выводим на экран наш объект StringBuffer strB.

public static void main(String[] args)

// ITVDN.com 17 из ТОП 20 тестовых заданий на интервью для Java разработчика

String st1 = » Мы готовимся к интервью на вакансию Java разработчика»;

Популярные методы для работы с Java массивами

В этой статье мы сделали подборку наиболее используемых методов для работы с массивами в Java. Разберем на примерах стандартные Java возможности и посмотрим в сторону библиотеки Apache Commons Lang.

Печать элементов массива

Сортировка массива

Создание ArrayList из массива

Простой способ создания коллекции ArrayList из массива может содержать подводные камни. Подробнее о возможных проблемах читайте здесь.

Другой пример использования смотрите по ссылке.

Создание массива из ArrayList


Ниже представлен простой пример «на коленке», а по ссылке есть с объяснением.

Содержит ли массив указанный элемент

Используем прием с представлением массива в виде коллекции и вызовом привычного метода contains() :

Копирование массива в Java

Используем методы копирования массива Arrays.copyOf() , Arrays.copyOfRange() , System.arraycopy() и даже Object.clone() . Вот еще примерчик .

Преобразование массива в Set

Подробнее познакомиться с коллекцией Set можно здесь, а узнать разницу между Set и Set тут.

Преобразование int в массив byte

Используем библиотеку Apache Commons Lang

Библиотека Apache Commons Lang представляет собой набор служебных классов для упрощения работы с классами пакета java.lang.* . В нашем случае, мы воспользуемся доступными методами для работы с массивами.

Подключить эту библиотеку к своему приложению Вы можете с помощью зависимости для maven проектов:

Java-массивы. Динамические массивы в Java

Массив — набор определённого числа однотипных элементов. Использование массива позволяет нам не создавать большое количество переменных, а создать всего лишь одну переменную, имеющую вид массива. В отличие от стандартных переменных массивы содержат больше, чем одно значение. В программировании это очень важно, ведь при разработке софта может потребоваться огромное количество данных.

Лучшая ассоциация для массива — стена с почтовыми ячейками. Каждая ячейка помечена квартирными номерами (индексы массива), внутри лежат газеты и письма (элементы массива), а получить содержимое можно, открыв ящик ключом (обратиться к содержимому по позиции элемента в массиве через индекс). При этом содержимое массива может включать в себя как простые данные (это одномерный массив), так и несколько вложенных массивов (это многомерный массив).

Массив однороден, и во всех ячейках должны храниться элементы одного типа. Если это int, то мы говорим про массив целых чисел, который может содержать лишь целые числа. Массив строк будет содержать лишь строки, а массив, состоящий из элементов созданного класса Dog, может содержать лишь объекты Dog.

Как происходит объявление массива в Java

Как и любую переменную в Java, массив надо объявить. Для этого есть два способа. Первый больше отвечает стилю Java, второй является наследием языка C.

Вне зависимости от способа, dataType — это тип переменных в массиве. Посмотрите внимательно на примеры — в них объявлены 2 массива. Один предназначен для целых чисел типа int, другой — для объектов типа Object.

Можно сказать, что во время объявления массива ему присваивается как имя (ArrayName), так и тип переменных.

Создание массива

Чтобы создать массив в Java, нужно зарезервировать место в памяти, для чего используем оператор new:

Здесь у нас typeOfArray — тип массива, length — длина массива или число ячеек, выраженное в целых числах (int). Но мы лишь выделили память под массив, не связав его ни с какой переменной, ранее объявленной. Как правило, сначала массив объявляют, потом создают:

Итак, объявлен массив из целых чисел с именем myArray. После объявления мы сообщили, что массив состоит из 10 ячеек. Но можно использовать и более сокращённый синтаксис:

Что же, мы создали массив с помощью new. После этого в его ячейках будут записаны значения по умолчанию. Например, для численных типов — это нули (0), для boolean — false, а если говорить о ссылочных типах, то null. Это значит, что после выполнения кода

у нас на выходе будет массив из 10 целых чисел, причём в каждой ячейке будет записан 0.

Длина массива length

Длина массива — число элементов, под которое этот массив рассчитан. Длину массива изменить после создания нельзя.

Ещё нюанс: элементы массива в Java нумеруются с нуля. Таким образом, массив на 10 элементов состоит из чисел в диапазоне 0-9.

Если нужно получить доступ к длине нашего массива, используют переменную length:

Инициализация массива

Инициализация — это заполнение массива конкретными данными, а не данными по умолчанию.

Нижеследующий код позволит создать массив, включающий в себя 4 сезона года. Также мы выполним заполнение массива строками-названиями сезонов:

Так мы записали названия всех сезонов. Но в принципе можно всё сделать проще, совместив инициализацию и объявление:

Или даже так, опустив оператор new:

Динамический массив в Java

Минус массива — статичность, то есть необходимость задавать размер заранее. Для этого и придумали динамический массив, который может менять размер в процессе выполнения программы. Например, статические массивы работают по следующей схеме:

А динамические массивы в Java функционируют несколько иначе:

Так как для копирования массива используется специальная нативная функция, проблем с «переездом» не возникает.

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

Собеседование на java-программиста (java-developer interview). Часть 2: Вопросы

Это продолжение цикла статей о собеседовании на java-программиста:

Java-related технологии и фреймворки рождаются и умирают, а без знания java core далеко не уедешь. Как можно знать Hibernate, но не знать JDBC и SQL? Как можно разбираться в Spring MVC или Struts, но при это плавать в сервлетах? Как можно пользоваться блокирующими очередями, экзекьюторами и локами, но при этом не понимать, как работают wait/notify? Для меня это до сих пор остается загадкой.

С другой стороны, меня иногда удивляют вопросы сотрудников, которые они задают кандидатам. Зачем спрашивать о Vector и Hashtable — на дворе уже скоро 4-ое тысячелетие. Или «зачем нужен UNION»? Так и хочется ответить — для SQL-инъекций. На счет паттернов проектирования и UML я вообще молчу — неужели до сих пор не наигрались? Но это еще полбеды. Иногда интервьюеры сами допускают довольно грубые ошибки. Об этом чуть позже.

Ниже приведен список вопросов (точнее небольшая его часть), которые я задаю на собеседовании, с моими комментариями. Вся прелесть в том, что в зависимости от позиции (junior java developer, mid-level, senior developer) и специализации некоторые из вопросов превращаются в более короткие либо более продолжительные диалоги с кандидатом и проверяют не только технические знания, но и умение мыслить и делать логические умозаключения. После многих пунктов вы найдете ссылки на статьи по соответствующей тематике.

[Disclamer: В статье выражается до безобразия субъективное мнение. Резкие выражения используются исключительно для донесения своих мыслей до читателя: никого обижать я не собирался и не собираюсь. Людям с расшатанной психикой или зашкаливающим ЧСВ читать, и тем более комментировать, категорически воспрещается. К спамерам и троллям это не относится: каждый ваш комментарий как лучик света в этом царстве тьмы, и дай вам бог всем здоровьечка.]

Вопросы собеседования по Core Java

Для позиций типа Senior эти вопросы можно пропустить. Но иногда все же стоит перестраховаться.

1. Модификаторы в Java.

Особо глубоко спрашивать не нужно — вкратце о назначении и вариантах использования. Можно спросить о контекстах использования этих модификаторов (класс/поле/метод). Подробные вопросы о модификаторах доступа, расширении модификаторов при наследовании, переопределение и сокрытие методов, модификатор abstract и final для классов/методов лучше оставить для вопросов по ООП в Java. Подробное знание модификаторов synchronized и volatile можно проверить в вопросах по многопоточности.

Небольшая статья про модификаторы — здесь.

2. Иерархия коллекций в Java.

Рассматриваем Collection, Set, List, Queue, Map и их основные реализации. Можно в принципе спросить о методах, которые есть в интерфейсе Collection, но лучше не надо. Стоит поинтересоваться, какими коллекциями человек пользовался, но опять же без фанатизма. Напоминаю, Vector и Hashtable (и Stack кстати тоже) — прошлый век, тем более в случае работы с legacy кодом всегда можно посмотреть сорцы. Еще можно поговорить о массивах, а следующий код может привести к интересному диалогу:

По поводу свойств и контракта equals/hashCode спросить стоит и о поломке коллекций тоже, но сильно не увлекайтесь, так как это может привести к любимому вопросу большинства интервьюеров об устройстве HashMap. В свою очередь это напрямую ведет нас к вопросам о структурах данных, алгоритмах и их сложности. Мое мнение по этому поводу — с алгоритмами хорошо знакомы олимпиадники и те, у кого в университете это преподавалось на должном уровне. Мне, например, в этом плане не повезло ни с тем, ни с другим. И разбирался в алгоритмах/АТД по ходу своей работы только тогда, когда возникали соответствующие задачи или просто было время и желание почитать и осознать. В результате — quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue тоже напишу. Что-то еще нужно? Окей, напишу.

Цукерберг рекомендует:  Как использовать data-атрибуты HTML5

Что делать, если шило все же мешает и хочется хоть раз в жизни показать свои глубочайшие знания в области алгоритмов и структур данных и без того напуганному кандидату. Начнем с того, что такие вопросы стоит задавать только senior разработчику и только если задачи такого плана встречаются на проекте достаточно часто (что встречается достаточно редко). Так уж и быть, спрашивайте об устройстве HashMap и скорости поиска, об устройстве LinkedList и сложности операций над ним. Можно попросить, чтобы человек своими словами рассказал, откуда в quick/merge sort берется log2n. Можно еще какую-нибудь задачу алгоритмическую задать. Но помните, возможно с этим человеком вам еще придется работать в одной команде.

3. Иерархия исключений и ошибок.

Тут как бы все понятно, но бывает, что люди не знают элементарных вещей. Стоит спросить об иерархии, о checked и unchecked ошибках/исключениях, когда используются те или иные, как и когда их нужно обрабатывать. Можно даже начать небольшой диалог по поводу OutOfMemoryError. Если человек знаком с JDBC, можно поговорить об SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.

Ответ на этот вопрос можно найти здесь

4. Вложенные классы в Java.

Некоторые считают, что этот вопрос не нужен. Лично я так не думаю. Стоит спросить о классификации, вариантах использования, о нарушении инкапсуляции и самое интересное — зачем они нужны по мнению кандидата.

Моя статья о вложенных классах на Quizful — здесь.

И статья об анонимных классах — здесь.

Вопросы по ООП в Java

5. Основы ООП

Здесь уже подробно рассматриваем модификаторы доступа и прочие вещи, которые я упомянул в комментариях к первому вопросу. Можно спросить об интерфейсах и абстрактных классах. Пусть человек своими словами расскажет о полиморфизме и инкапсуляции. Если хотите послушать рассуждения человека, можно спросить о таком фрагменте кода:

Как продолжение, на этом же примере можно поговорить о расширении/сужении типов в аргументах переопределяемых методов в случае, если бы в Java список формальных параметров не входил бы в сигнатуру метода.


6. Паттерны проектирования

Напоминаю, не стоит глубоко спрашивать о паттернах проектирования. И ни в коем случае не поучайте кандидата рассказами о том, «насколько они полезные» и «как их правильно реализовывать». Кстати, по поводу красоты/понятности кода и быстроты его написания мой друг говорит следующее: «Чтобы уметь круто хачить на Java, нужно дохера хачить на Java».

Каталог паттернов проектирования можете найти здесь

Вопросы собеседования по многопоточности в Java

7. Многопоточность в Java.

Хочу посвятить этой теме цикл статей: одним абзацом не отделаешься. Если вкратце, спросите, зачем нужна многопоточность, что такое монитор объекта, спросите о модификаторах syhcnronized и volatile, методах wait/notify/notifyAll, а так же о пакете java.util.concurrent. А следующий фрагмент кода должен привести к достаточно интересному разговору:

Интересная статья про методы wait/notify доступна здесь.

Вопросы, связанные с базами данных

8. SQL

Для начала стоит задавать вопросы по ANSI SQL. Далее, в зависимости от СУБД, используемой на проекте, можно спрашивать о важных отличиях ее диалекта. Итак, пусть человек расскажет об основных элементах баз данных — таблицах, процедурах, функциях, констрейнтах и т.д. О констрейнтах можно поспрашивать чуть подробнее. Стоит поинтересоваться, как человек понимает null в базах данных. Переходите к агрегатным функциям и о том, как они работают с null, не забудьте о group by и having. Можно дать пару маленьких задачек на эту тему (см. задачи 1-2 ниже). Поспрашивайте о типах join и дайте пару задачек (см. задачи 3-4 ниже).

Задача 1. Дана таблица T с колонкой A целого типа, содержащая значения 10, 20, 30, null. Чему будут равны результаты выражений «AVG(A)» и «SUM(A) / COUNT(*)»?

Задача 2. Дана таблица T с колонкой A целого типа. Напишите запрос, который вернет все положительные значения встречающиеся в таблице более одного раза.

Задача 3. Даны таблицы T1 и T2. В каждой есть колонка A целого типа. Значения в первой таблице — 1, 2, а во второй — 2, 3. Что вернут запросы с inner join, left/right/full outer join и cross join вида «select T1.A, T2.A from T1 . join T2 on T1.A = T2.A».

Задча 4. Даны 2 таблицы с колонками A целого типа. Напишите запрос, который вернет все значения колонки А из первой таблицы, для которой нет соответствия в колонке A второй.

Статья о конструкции Join доступна здесь

9. JDBC API

Тут тоже без особых извращений. Спросите о Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Можно поинтересоваться о том, чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.

Еще вопросы — как создать соединение в JDBC, каким образом лучше добавлять большое количество записей в таблицу, ну и обязательно о транзакциях и autocommit. Чуть не забыл — вопрос об уровнях изоляции транзакций считаю как минимум странным — в следующий раз, когда решите его задавать, вспомните, сколько раз с уровнями изоляции сталкивались лично вы.

Читайте на блоге подробный туториал по JDBC.

Вопросы собеседования по веб-программированию

10. Servlet API

Для начала надо спросить об HTTP в целом. Что такое хедеры запроса, какие вообще типы запросов бывают, что такое HTTP Status Code.

Далее нужно спросить про класс HttpServlet, в каком виде можно работать с запросом и ответом. Что такое сессия (HttpSession) и как ее получить. Не забудьте спросить про ServletFilter и варианты их использования.

Организм требует сна. Статью завершу через некоторое время. Удачи всем.

Java: проверка равенства массивов (порядок не имеет значения)

У меня есть два массива String , скажем:

//эти массивы должны быть равны

Я хотел проверить их равенство «самым чистым» способом.

Я попытался использовать Arrays.equals(s1,s2) , но я получаю ложный ответ. Я предполагаю, что этот метод касается порядка элементов, и я не хочу, чтобы это имело значение.

Не могли бы вы рассказать мне, как я могу сделать это красиво?

  • Arrays.sort(s1);
  • Arrays.sort(с2);
  • Arrays.equals(s1, s2);

Если вы не хотите изменять исходные массивы

Arrays.sort() использует оптимизированную быструю сортировку, которая является nlog (n) для среднего, но O (n2) в худшем случае. Из java-документов. Поэтому в худшем случае O (n2), но в большинстве случаев это будет O (nlogn).

Алгоритм сортировки — это настроенная быстродействующая сортировка, адаптированная из Jon L. Bentley и M. Douglas McIlroy «Engineering a Sort Function», Software-Practice and Experience, Vol. 23 (11), с. 1249-1265 (ноябрь 1993 года). Этот алгоритм обеспечивает производительность n * log (n) на многих наборах данных, которые приводят к снижению производительности в быстродействующих секторах до квадратичной производительности.

Другие предложили сортировать массивы. Но так как вы ищете «самое чистое» решение, я думаю, что оригинальные массивы не следует трогать. Следовательно:

Если вы используете Коллекции Eclipse (ранее Коллекции GS), вы можете использовать Bag , чтобы выяснить, равны ли эти два массива.

Сумки (также известные как мультимножества) считаются равными, если они имеют одинаковое количество вхождений каждого элемента. Заказ не имеет значения, и он правильно обрабатывает повторяющиеся элементы. Преимущество использования мешка, поддерживаемого хеш-таблицей, заключается в том, что создание занимает линейное время. Сортировка и принимает O (n log n).

Примечание: я являюсь коммиттером для коллекций Eclipse

Итерации по первому массиву, проверка наличия каждого элемента во втором массиве, а затем выполнение этого же для второго массива в первом массиве. Время: n ^ 2. Обратите внимание, что этот метод предполагает, что ни один элемент не повторяется. Если бы это было так, вам нужно было бы для каждого элемента, который вы проверяете, вернуться к началу и подсчитать, сколько экземпляров этого элемента есть (скажем, X), и только считать успехом, как найти X-й элемент в второй массив. Это позволит устранить необходимость второй проверки и оставить упражнение для читателя (если вы так склонны, то есть.)

Более продвинутый способ: сортировать оба массива и перемещаться по ним. Время: n lg n

Еще более продвинутый способ: использовать hashmap, добавляя для счетчиков первого массива строк, удаляя для счетчиков второго массива строк. Когда вы все равно, все значения должны быть равны нулю.

Set::equals

Для этого вам не нужны внешние библиотеки. Set<> уже имеет метод equals , который делает независимое от заказа сравнение.

Я предполагаю, что это для школы.

  • используйте Arrays.sort для сортировки обоих массивов, а затем используйте цикл для сравнения s1 [i] с s2 [i]
  • используйте цикл и для каждого элемента s1 посмотрите на элементы s2, чтобы найти, содержит ли он тот же
  • поместите элементы s1 в hashset, а затем используйте цикл на s2 и посмотрите, находятся ли ваши элементы в s1

Сначала я бы отсортировал 2 массива, а затем сравнил строки за строкой.

Если часто приходится сравнивать массивы друг с другом, не изменяя их содержимое, может оказаться полезным определить тип, который инкапсулирует неизменяемый массив, его отсортированную версию, число long , которое гарантировано уникальным и по крайней мере, в основном коррелирует с возрастом объекта и ссылкой на исходный нуль на другой более старый объект, который, как известно, соответствует. Также может быть полезно кэшировать хеш-значение, которое объединяет хеш-значения всех элементов массива.

Используя такой подход, сортировка будет требоваться при первом сравнении объектов с чем-либо (что-либо), но не после этого. Кроме того, если объекты X и Y оба найдены равными Z, то сравнение между X и Y может сообщать о них как о равном без фактического изучения содержимого массива (если Z старше X и Y, то оба будут сообщать себя как равные к одному и тому же более старому объекту, если X является самым младшим, а Y — самым старым, X будет знать его равным Z, а Z будет знать его равным Y. Когда X следующий по сравнению с чем-то, он узнает, что самая старая вещь, которую он знал быть равным Y, поэтому он, конечно, будет равен Y.

Такой подход обеспечит преимущества производительности сравнений по сравнению с интернированием, но без необходимости использования интернированного словаря.

Для небольших массивов я использовал бы Arrays.sort и Arrays.equals , как предложили другие. Для больших массивов вы можете использовать следующее решение, которое имеет лучшую временную сложность — O(n) , а не O(n log n) .

Посмотрите другие вопросы по меткам java string arrays или Задайте вопрос

Составные операторы присваивания в Java

Операторы сложного присваивания обеспечивают более короткий синтаксис для назначения результата арифметического или побитового оператора. Они выполняют операцию над двумя операндами, прежде чем присваивать результат первому операнду.
Ниже приведены все возможные операторы присваивания в Java:

Реализация всего составного оператора присваивания

ссылка на сайт
brightness_4
код

Правила разрешения составных операторов присваивания

Во время выполнения выражение оценивается одним из двух способов. В зависимости от условий программирования:

  1. Если выражение левого операнда не является выражением доступа к массиву, то:
    • Сначала вычисляется левый операнд для создания переменной. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине; правый операнд не оценивается, и присвоение не происходит.
    • В противном случае значение левого операнда сохраняется, а затем вычисляется правый операнд. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине, и назначение не происходит.
    • В противном случае сохраненное значение левой переменной и значение правого операнда используются для выполнения двоичной операции, указанной оператором сложного присваивания. Если эта операция завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине, и назначение не происходит.
    • В противном случае результат двоичной операции преобразуется в тип левой переменной, подвергается преобразованию набора значений в соответствующий стандартный набор значений, и результат преобразования сохраняется в переменной.
  2. Если выражение левого операнда является выражением доступа к массиву, то:
    • Сначала оценивается подвыражение ссылки на массив выражения доступа к массиву левого операнда. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине; подвыражение индекса (выражения доступа к массиву левого операнда) и правый операнд не оцениваются, и присваивания не происходит.
    • В противном случае вычисляется подвыражение индекса выражения доступа к массиву левого операнда. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине, и правый операнд не оценивается, и назначение не происходит.
    • В противном случае, если значение подвыражения ссылки на массив равно нулю, присваивание не происходит и генерируется исключение NullPointerException.
    • В противном случае значение подвыражения ссылки на массив действительно относится к массиву. Если значение подвыражения индекса меньше нуля или больше или равно длине массива, тогда присваивание не происходит и создается исключение ArrayIndexOutOfBoundsException.
    • В противном случае значение подвыражения индекса используется для выбора компонента массива, на который ссылается значение подвыражения ссылки на массив. Значение этого компонента сохраняется, а затем вычисляется правый операнд. Если эта оценка завершается преждевременно, то выражение присваивания завершается преждевременно по той же причине, и назначение не происходит.

Примеры: разрешение операторов с помощью составных операторов присваивания

Мы все знаем, что всякий раз, когда мы присваиваем большее значение переменной типа данных меньшего размера, мы должны выполнять явное приведение типов, чтобы получить результат без каких-либо ошибок во время компиляции. Если мы не выполнили явное приведение типов, мы получим ошибку времени компиляции. Но в случае составных операторов присваивания внутреннее приведение типов будет выполняться автоматически, даже если мы присваиваем большее значение меньшей переменной типа данных, но может быть вероятность потери информации данных. Программист не несет ответственности за выполнение явного приведения типов. Давайте посмотрим на приведенный ниже пример, чтобы найти разницу между обычным оператором присваивания и составным оператором присваивания.
Составное выражение присваивания в форме E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T — это тип E1, за исключением того, что E1 оценивается только один раз.

Например, следующий код является правильным:

и в результате x имеет значение 7, потому что оно эквивалентно:

Потому что здесь 6.6, который является двойным, автоматически преобразуется в короткий тип без явного приведения типов.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих