MessageFormat
Бул макалада мен 2412 (task2412) тапшырмасында колдонулган класс жөнүндө айткым келет .
Класс
MessageFormat
саптарды түзүү үчүн иштелип чыккан. Бул Java классы an objectтердин жыйындысын алып, аларды форматтайт жана андан кийин форматталган саптарды тиешелүү жерлерде калыпка киргизет. Бул статикалык методго альтернатива (же кошумча) түрү
String.format
. Биринчиден, бул Java классын an object түзбөстөн колдонуунун жөнөкөй мисалы, бирок статикалык ыкманы колдонуу:
int planet = 7;
String event = "a disturbance in the Force";
String result = MessageFormat.format(
"At {0, time, medium} on {0, date}, there was {1} on planet {2, number, integer}.",
new Date(), event, planet);
System.out.println(result);
Бул жерде статикалык метод деп аталат
MessageFormat.format
, ага сап шаблону жана чындыгында кашаа менен бөлүнгөн жерлерге киргизиле турган an objectтер аргумент катары өткөрүлөт
{}
. Объекттин позициясы кашаанын ичинде көрсөтүлөт
0
, ошондой эле форматтоо түрү, эгер бар болсо. Чыгуу төмөнкүдөй болот:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
Төмөнкү мисал мурунтан эле класстын an objectисин түзөт
MessageFormat
:
int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {fileCount, diskName};
MessageFormat form = new MessageFormat(
"The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
Класс an objectи түзүлгөндө,
MessageFormat
сап шаблону анын конструкторуна өткөрүлүп берилет.
format
Андан кийин, an objectке методду чакырганда , сап шаблонуна киргизиле турган an objectтердин массиви ал жерге аргумент катары өткөрүлүп берилет. Чыгуу төмөнкүдөй болот:
The disk "MyDisk" contains 1 273 file(s).
Керектүү текст өзгөрмөнүн маанисине жараша тандалганына да ынанууга болот.
if...else
Классты колдонуу менен гана операторду ишке ашыруунун бир түрү
ChoiceFormat
. Бул жерде code:
MessageFormat form = new MessageFormat("Я могу {1} {0}.");
int count = 2;
String exercise = "подтянуться";
Object[] testArgs = {count, exercise};
double[] filelimits = {0,2,5};
String[] filepart = {"{0} раз","{0} раза","{0} раз"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
form.setFormatByArgumentIndex(0, fileform);
System.out.println(form.format(testArgs));
Бул code өзгөрмөнүн маанисине жараша
count
саптын чыгышын төмөнкүдөй өзгөртөт:
-
count = 1
тыянак ушундай болсо
Я могу подтянуться 1 раз.
-
count = 2
тыянак ушундай болсо
Я могу подтянуться 2 раза.
-
count = 7
тыянак ушундай болсо
Я могу подтянуться 7 раз.
double[] filelimits
Бул code саптардын чыгышы өзгөрө турган маанилердин чегин белгилеген массивди түзөт . Ал эми массив
String[] filepart
колдонула турган саптардын варианттарын көрсөтөт.
filepart[j]
Өзгөрмө маанисинен сызык опциясын тандоо шарттары төмөнкүчө аныкталат: параметр, эгерде , тандалат
filelimits[j] =< count < filelimits[j+1]
. Андан кийин an object түзүлүп, массивдер түзүлөт жана
ChoiceFormat fileform
анын конструкторуна өткөрүлүп берилет . Метод менен биз an objectке айтабыз , бул ыкма чакырылганда , андан кийин сап үлгүсүндөгү 0 индекси үчүн an objectте көрсөтүлгөн форматтоо колдонулат . Жакшы. Негизи, сиз эч качан Java классын колдонбоо идеясына ээ болушуңуз мүмкүн , бирок бул бардык коңгуроо жана ышкырык эмес экенин бorңиз. Бул code бар:
double[] filelimits
String[] filepart
form.setFormatByArgumentIndex(0, fileform)
MessageFormat form
format
ChoiceFormat fileform
MessageFormat
MessageFormat pattform = new MessageFormat("There {0} on {1}.\n{2} {2}");
int count = 0;
Date date = new Date();
Object[] testArgs = {count, "ADisk", date, date};
double[] filelimits = {0,1,2};
String[] filepart = {"are no files","is one file","are {0} files"};
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
Format[] testFormats
= {fileform, null, DateFormat.getDateInstance(DateFormat.SHORT), DateFormat.getTimeInstance(DateFormat.SHORT)};
pattform.setFormats(testFormats);
System.out.println(pattform.format(testArgs));
Бул жерде массивдин негизги өзгөчөлүгү болуп саналат
Format[] testFormats
.
Format
Бул массивге массивде аныкталган an objectтерди форматтоого жооптуу an objectтерди (абстрактуу классты ишке ашыруу) кошобуз
Object[] testArgs
. Эгерде an object форматтоого муктаж болбосо,
Format[] testFormats
анда
null
. Андан кийин, an objectке сап үлгүсүндөгү бардык индекстер массивде аныкталган форматтоону колдонуусу керек деп айтуу үчүн ыкманы
pattform.setFormats(testFormats)
колдонобуз . Бул мисал үчүн, чыгаруу төмөнкүдөй болот:
MessageFormat pattform
Format[] testFormats
There are no files on ADisk.
28.04.18 22:10
Ушунун баары, 2412-маселени чечүүдө эч кандай кыйынчылык болбойт деп ишенем.
GO TO FULL VERSION