JavaRush /Java блог /Random UA /Клас MessageFormat
Виталий Рыжаков
40 рівень
Москва

Клас MessageFormat

Стаття з групи Random UA
У цій статті я хочу розповісти про клас MessageFormat, який використовується у задачі 2412 (task2412). Клас MessageFormat - 1Клас 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 у вас не виникне труднощів.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ