Задача
Рассмотрим следующее выражение. Какой ответ из приведенных будет верным результатом?
int lenOfStr = "Is it possible?".length();
Варианты ответа:
1. Ошибка компиляции генерируется.
2. Ошибка выполнения генерируется.
3. Переменная, lenOfStr, устанавливается в 0.
4. Переменная, lenOfStr, установлена в 15
Ответ: 4.
Объяснение
"Is it possible?" является объектом String. Метод length() экземпляра класса String возвращает количество символов объекта String, включая пробелы. Значение 15 возвращается при вызове метода length() объекта String "Is it possible?". Таким образом, переменная lenOfStr устанавливается в 15.
Задача
Учитывая строковые объекты S1 и S2 ниже:
String s1 = "zzz";
String s2 = "ZZZ";
Каким будет возвращенное значение следующих сравнений?
i) int v1 = s1.compareTo("AAA");
ii) int v2 = s2.compareTo("aaa");
Варианты ответа:
1. i) v1 <0 ii) v2> 0
2. i) v1> 0 ii) v2 <0
3. i) v1> 0 ii) v2> 0
4. Ошибка компиляции.
Ответ: 2.
Объяснение
compareTo() метод экземпляра класса String сравнивает лексикографически последовательность символов, представленную текущей строкой, с символьной последовательностью, представленной другим объектом String.
Отрицательное целое число возвращается, если текущая строка лексикографически меньше другой строки. Положительное целое число возвращается, если текущая строка лексикографически больше другой строки. 0 возвращается, если две строки равны.
В первом сравнении, символ 'z' лексикографически больше символа 'A'. Таким образом, положительное значение присваивается переменной v1. Во втором сравнении, символ 'Z' лексикографически меньше символа 'a'. Таким образом, отрицательное значение присваивается переменной v2.
Задача
Завершите реализацию метода, isPalindrome(String), который берет строку в качестве параметра и возвращает true, если строка является палиндромом. В противном случае, возвращается false. Ваша реализация метода isPalindrome() не должна быть чувствительна к регистру.
Вы можете предположить, что метод reverseString(String) обеспечивается и имеет следующую реализацию.
public static String reverseString(String inputStr){
String revStr= "";
for(int i=0; i < inputStr.length( ); i++) {
revStr= inputStr.charAt(i) + revStr;
}
return revStr;
}
Для проверки метода, щелкните правой кнопкой мыши на классе PalindromeChecker и нажмите на boolean isPalindrome(String str) методе. Введите строку в двойных кавычках и нажмите Ok.
Ответ:
return str.equalsIgnoreCase(reverseString(str));
или
return str.toLowerCase().equals(reverseString(str).toLowerCase());
или
return str.toUpperCase().equals(reverseString(str).toUpperCase());
Задача
Завершите реализацию метода, searchFromRecord(String, String). Метод принимает имя файла, как первый параметр, и слово, в качестве второго параметра. Метод открывает файл записи под заданным именем и возвращает истину, если слово существует в файле записи. В противном случае, возвращается ложь. Ваша реализация метода должна учитывать разницу в регистре, то есть, сравнение слов должны быть чувствительно к регистру.
Вы можете сделать следующие предположения:
1. Запись файла всегда существует.
2. Слова в записи хранятся в отдельной строке.
Для проверки метода, нужно создать экземпляр SearchRecordDemo и запустить void searchWord() метод экземпляра. Вы можете затем вводить слово в окне терминала. Результаты поиска будут отображаться после ввода слова.
В дополнение к вводу слово, набором, мы можем также вводить слово из изображения. Метод inputTextImage() класса IO считывает изображение от пользователя, и выполняет оптическое распознавание символов (OCR) для распознавания строки в изображении.
Этот метод поддерживается только на платформе Windows, с установленным Visual C++ Redistributable для Visual Studio 2012. Вы можете скачать его здесь http://www.microsoft.com/en-us/download/details.aspx?id=30679. Пожалуйста, выберите VSU_4\vcredist_x86.exe установку, если вы используете 32-разрядную систему и выберите VSU_4\vcredist_x64.exe если вы используете 64-разрядную систему. Перезагрузите компьютер после завершения установки.
Чтобы включить OCR в программе, закомментируйте следующую строку в методе searchWord():
String word = IO.inputString();
Раскомментируйте следующую строку в блоке объявлений класса SearchRecordDemo:
private static Loader loader = new Loader();
После этого, раскомментировать следующие строки в методе searchWord():
String word = IO.inputTextImage();
word = removeExtraSpace(word);
IO.outputln(word);
Ответ:
File record = new File(recordName);
Scanner scanner = new Scanner(record);
String line;
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if (line.equals(word)) {
scanner.close();
return true;
}
}
scanner.close();
return false;
Далее я представлю вам краткое введение в управляемое событиями программирование и графический интерфейс пользователя или GUI.
Мы рассмотрим эти темы поверхностно.
Введение обеспечит вам достаточные знания, чтобы вы смогли освоить более сложные понятия.
В общем и целом, те программы, которые мы писали до сих пор, выполняют действия, следующие определенному процессуальному порядку.
То есть, выполнение осуществляется либо шаг за шагом, или управление передается другой процедуре или методу, который опять будет выполнять действия шаг за шагом.
Даже если мы здесь используем объектно-ориентированный подход, объекты, созданные с помощью программы, будут общаться друг с другом через вызовы методов, но действия будут по-прежнему следовать последовательно более или менее заранее определенными шагами.
Давайте, используем пример для дополнительной иллюстрации, что это значит.
В этой программе, мы используем знакомые нам классы Canvas и ColorImage.
Программа просто пытается отобразить изображения happyface и tcpong на холсте.
И есть еще один метод, называемый moveHappyFace, который перемещает happyface изображение на новое место х, у.
Когда создается экземпляр класса EventDrivenDemo, изображение tcpong будет добавлено на холст с расположением 200, 200, и изображение HappyFace на позицию 0,0 по умолчанию, как показано здесь.
Откроем IDEA, чтобы увидеть, как эта программа действительно работает.
Давайте скомпилируем программу и создадим экземпляр объекта.
Два изображения отображаются на холсте, как и ожидалось.
Скажем, что если мы хотим переместить happyface изображение на верхнюю часть фотографии так, чтобы она смотрелась еще счастливее, и для этого мы можем использовать метод moveHappyFace.
Но мы не знаем точно, куда двигаться.
Давайте попробуем 200х200, потому что это место фотографии.
Ну, это не совсем то, что я хочу, потому что это на самом деле изображение не накладывается на лицо.
Но тогда, если вы помните, мы можем на самом деле использовать мышь, чтобы перетащить изображение.
Так что, мы можем перетащить счастливое лицо в нужное место фотографии.
В общем и целом, событийное программирование – это парадигма программирования, в которой поток программы определяется событиями, такими как клик мыши, нажатие мыши, сообщениями из другой программы, или событиями сенсорного экрана.
Событийное программирование особенно полезно в графических интерфейсах пользователя.
В примере, который я только что продемонстрировал, мы можем использовать мышь, чтобы перетащить изображение в другое место.
Перетаскивание мышью, в этом случае, является событием, созданным пользователем.
Хотя, вы можете не знать об этом, программа на самом деле работает за сценой, отслеживая движение мыши при обновлении положения happyface изображения.
Этот вид графических интерфейсов позволяет выполнять такие задачи просто.
В управляемом событиями программировании, программный код выполняется при активации событий.
Событие может служить сигналом для программы, что что-то случилось.
Событие может быть сгенерировано внешними действиями пользователя, например, движением мыши, кликом мыши, и нажатием клавиши, событиями со стороны операционной системы, такими как таймер или исключение.
В нашем обсуждении, мы сосредоточим внимание на событиях, генерируемых в графическом интерфейсе пользователя.
В Java, для обработки событий используется модель делегации событий.
В модели делегации событий, событие генерируется, когда пользователь взаимодействует с графическим компонентом, например, кликая мышью по кнопке.
Графический компонент называется источником события.
После того, как событие генерируется, событие передается или делегируется другому объекту, который может обработать событие.
Эти объекты называются слушателями событий или обработчиками событий.
Для того чтобы получить уведомление о событии, слушатели должны быть зарегистрированы в исходном объекте.
Это эффективный способ обработки событий, потому что уведомления о событиях отправляются только тем слушателям, которые зарегистрированы.
Преимущество этого подхода заключается в том, что логика пользовательского интерфейса отделяется от логики, которая генерирует события.
Модель делегации событий состоит из трех основных компонентов, а именно источника событий, слушателя событий и объекта событий.
Диаграмма здесь показывает три компонента.
И я буду обсуждать каждый из них далее более подробно.
Источник события – это источник, из которого происходит событие.
Источник события отвечает за предоставление информации о произошедшем событии для своих обработчиков событий или слушателей.
Например, мы можем создать холст, как источник события нажатия мыши.
Объект события содержит всю необходимую информацию, в том числе об источнике события и другие данные, описывающие событие.
Например, событие нажатия мыши может включать X, Y координаты позиции мыши на холсте.
Приемник события, также известный как обработчик события, отвечает за генерацию ответов на событие.
Приемник событий ждет, пока не получает событие.
После того, как событие будет получено, слушатель запускает логику, определяющую как событие должно быть обработано.
Например, слушатель нажатия мыши может позиционировать цветное изображение в положение х, у, заданное событием щелчка мыши.