У цій статті я хочу розповісти про клас
MessageFormat
, який використовується у задачі 2412 (task2412). Клас MessageFormat
призначений для створення рядків. Даний клас Java приймає набір об'єктів, форматує їх, а потім вставляє форматовані рядки у шаблон у відповідних місцях. Це свого роду альтернатива (або навіть доповнення) до статичного методу String.format
. Для початку простий приклад використання цього Java класу без створення об'єкта, а використовуючи статичний метод:
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
, в який передаються аргументами шаблон рядка і, власне, об'єкти, які будуть вставлені в місця, обмежені дужками {}
. У дужках задається позиція об'єкта починаючи з 0
, а також тип форматування, якщо є. Висновок буде таким:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
У наступному прикладі вже створюється об'єкт класу 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));
При створенні об'єкта класу MessageFormat
до його конструктора передається шаблон рядка. Далі, при виклику методу format
об'єкта, туди як аргумент передається масив об'єктів, які будуть вставлені в шаблон рядка. Висновок буде таким:
The disk "MyDisk" contains 1 273 file(s).
Також можна зробити так, що в залежності від значення змінної вибиратиметься необхідний текст. Свого роду реалізація оператора if...else
, лише з допомогою класу ChoiceFormat
. Ось код:
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));
Цей код залежно від значення змінної count
змінює виведення рядка таким чином:
-
якщо
count = 1
висновок буде такимЯ могу подтянуться 1 раз.
-
якщо
count = 2
висновок буде такимЯ могу подтянуться 2 раза.
-
якщо
count = 7
висновок буде такимЯ могу подтянуться 7 раз.
double[] filelimits
, у якому вказуються межі значень, у яких змінюватиметься виведення рядків. На масиві String[] filepart
вказуються самі варіанти рядків, які можна використовувати. Умови вибору варіанта рядка від значення змінної визначаються так: вибереться варіант filepart[j]
, якщо filelimits[j] =< count < filelimits[j+1]
. Далі створюється об'єкт ChoiceFormat fileform
і його конструктор передаються масиви double[] filelimits
і String[] filepart
. За допомогою методу form.setFormatByArgumentIndex(0, fileform)
ми говоримо об'єкту MessageFormat form
, що коли викличуть метод format
, то для індексу 0 у шаблоні рядка використовуй форматування, яке було задано в об'єкті ChoiceFormat fileform
. Добре. У вас вже в принципі могла з'явитися думка ніколи не використовувати Java клас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
), які відповідають за форматування об'єктів, визначених у масиві Object[] testArgs
. Якщо об'єкт не потребує форматування, то масив Format[] testFormats
записується null
. Далі за допомогою методу pattform.setFormats(testFormats)
ми говоримо об'єкту MessageFormat pattform
, що для всіх індексів у шаблоні рядка треба використовувати форматування, визначене в масиві Format[] testFormats
. Для цього приклад висновок буде таким:
There are no files on ADisk.
28.04.18 22:10
На цьому все і я сподіваюся, що при вирішенні задачі 2412 у вас не виникне труднощів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ