Еще пара классов для общего развития. Представьте, что вы с клавиатуры хотите прочитать число int. А нельзя прочитать с клавиатуры число int. Надо прочитать строку, потом эту строку парсить и у вас получится 3-4 строки, чтобы эту операцию сделать. Поэтому давным-давно был написан класс Scanner, который позволяет читать данные с клавиатуры и главное он их читает, как строки внутри себя, но у него есть методы, которые сразу возвращают вам нужный простой тип. Например, метод «nextInt» возвращает прочитанное с клавиатуры целое число. Хорошая и очень полезная штука. Это может пригодиться.
Регулярные выражения.
Те, кто занимается Web-приложениями, конечно, должны быть в курсе очень эффективного способа работы с текстами. Это регулярные выражения.
Вопрос: Кто про них слышал?
Ответ: Представьте себе простую задачу. Вам говорят, пользователь будет вводить e-mail. Вам нужно проверить, что он ввел e-mail.
Вопрос: Сколько придется вам написать разных проверок и запрограммировать, чтобы убедиться, что это e-mail?
Ответ: Если вы напишите код, то это будет полстраницы кода, который по всем пунктам эти проверки выполняет. Вы спросите, ну и что с этим кодом не так? Да всё.
1) он медленный
2) представьте, что из 10 пунктов добавился какой-то 11. вам придется открыть код и его менять, а это не просто. Это очень не эффективно.
Вопрос: А что надо делать?
Ответ: В ЯП Perl это давным давно придумали. Называется « регулярные выражения ». РВ предлагает следующий подход. Вы делаете так называемый шаблон. К сожалению, изучение регулярных выражений не имеет никакого отношения к Java, потому что все время, которые вы там потратите, это будет время, потраченное на изучение того, как пишется шаблон этого регулярного выражения.
Чтобы ткнуть пальцев на что-то более менее приличное (см. ссылку на статью в презентации).
Этот шаблон пишется в одну строку.
Практика:
Конвертор целых чисел в двоичную систему.
Лабораторка
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package app18. pkg1;
/**
*
* @author Student
*/
public class App181 { //это мой класс внитри него все находится
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int year = 2016; //значение текущего года
int dayNum = 304; //значение в диапазоне от 1 до 365
int monthNum = 0;
int daysInMonths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //число дней в году
boolean isLeapYear= (year%4==0)& & (year%100! =0 || year%400==0);
//массив строк с именами месяцев
String months[] = {" January", " Febrary", " March", " April", " May", " June", " July", " August", " Septemper", " October", " November", " December" };
for(int days: daysInMonths)
{
//в теле цикла увеличиваем значение переменной days на 1
if(isLeapYear & & days==28) ++days;
if(dayNum < = days){break; }
else
{
//dayNum = dayNum - days;
dayNum -= days;
monthNum++;
}
System. out. printf(" %d %s \n", dayNum, months[monthNum]);
}
}
}
ЛАБА №2
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package laba. pkg2;
/**
*
* @author Student
*/
public class ComLineParser {
private String[] keys;
private String[] delimeters;
// варианты завершения разбора командной строки
public enum SwitchStatus { NoError, Error, ShowUsage };
public ComLineParser(String[] keys) {
this(keys, new String[]{" /", " -" });
}
public ComLineParser(String[] keys, String[] delimeters) {
this. keys = keys;
this. delimeters = delimeters;
}
public void OnUsage(String errorKey)
{
if(errorKey! = null)
{
//System. out. println(" формат ком. строки: имяПрограммы [-r< input-fileName> ] [-w< output-fileName> ]" );
System. out. println(" Command-line switch error: " + errorKey);
}
System. out. println(" формат ком. строки: имяПрограммы [-r< input-fileName> ] [-w< output-fileName> ]" );
System. out. println(" -? показать Help файл" );
System. out. println(" -r задать имя входного файла" );
System. out. println(" -w выполнить вывод в указанный файл" );
}
public SwitchStatus OnSwitch(String key, String keyValue)
{
System. out. println(key+" " +keyValue);
return SwitchStatus. NoError;
}
public Boolean Parse(String[] args) {
SwitchStatus ss = SwitchStatus. NoError;
int argNum;
for (argNum = 0; (ss == SwitchStatus. NoError) & & (argNum < args. length); argNum++) {
// провера наличия правильного разделителя
boolean isDelimeter = false;
for (int n = 0; ! isDelimeter & & (n < delimeters. length); n++) {
isDelimeter = args[argNum]. regionMatches(0, delimeters[n], 0, 1);
}
if (isDelimeter) {
// проверка наличия правильного ключа
Boolean isKey = false;
int i;
for (i = 0; ! isKey & & (i < keys. length); i++) {
isKey = args[argNum]. toUpperCase(). regionMatches(1,
keys[i]. toUpperCase(), 0, keys[i]. length());
if (isKey) break;
}
if (! isKey) {
ss = SwitchStatus. Error;
break;
} else {
ss = OnSwitch(keys[i]. toLowerCase(),
args[argNum]. substring(1 + keys[i]. length()));
}
}
else {
ss= SwitchStatus. Error;
break;
}
}
// завершение разбора командной строки
if (ss == SwitchStatus. ShowUsage) OnUsage(null);
if (ss == SwitchStatus. Error) OnUsage((argNum == args. length)? null: args[argNum]);
return ss == SwitchStatus. NoError;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package laba. pkg2;
/**
*
* @author Student
*/
public class Laba2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String[] keys = { "? ", " r", " w" };
//создаем объект этого класса
ComLineParser myarray = new ComLineParser(new String[]{"? ", " r", " w" });
myarray. Parse(args);
for(String s: args){
//myarray. Parse();
}
// for(String s: args){
// System. out. println(s);
// }
}
}