JavaRush /Blog Java /Random-PL /Klasa MessageFormat
Виталий Рыжаков
Poziom 40
Москва

Klasa MessageFormat

Opublikowano w grupie Random-PL
W tym artykule chcę porozmawiać o klasie MessageFormatużytej w zadaniu 2412 (zadanie 2412). Format wiadomości klasowej — 1Klasa MessageFormatprzeznaczona jest do tworzenia ciągów znaków. Ta klasa Java pobiera zestaw obiektów, formatuje je, a następnie wstawia sformatowane ciągi znaków do szablonu w odpowiednich lokalizacjach. Jest to swego rodzaju alternatywa (a nawet dodatek) do metody statycznej String.format. Najpierw prosty przykład użycia tej klasy Java bez tworzenia obiektu, ale przy użyciu metody statycznej:
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);
Tutaj wywoływana jest metoda statyczna MessageFormat.format, do której jako argumenty przekazywany jest szablon ciągu znaków i w istocie obiekty, które zostaną wstawione w miejsca oddzielone nawiasami {}. W nawiasach podano położenie obiektu rozpoczynającego się od 0oraz rodzaj formatowania, jeśli występuje. Dane wyjściowe będą takie:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
Poniższy przykład tworzy już obiekt klasy 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));
Kiedy tworzony jest obiekt klasy, MessageFormatdo jego konstruktora przekazywany jest szablon ciągu. Następnie podczas wywoływania metody formatna obiekcie jako argument przekazywana jest tablica obiektów, które zostaną wstawione do szablonu ciągu znaków. Dane wyjściowe będą takie:
The disk "MyDisk" contains 1 273 file(s).
Można także upewnić się, że żądany tekst został wybrany w zależności od wartości zmiennej. Rodzaj implementacji operatora if...else, wykorzystujący jedynie klasę ChoiceFormat. Oto kod:
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));
Kod ten, w zależności od wartości zmiennej, countzmienia wynik linii w następujący sposób:
  • jeśli count = 1wnioski będą takie

    Я могу подтянуться 1 раз.
  • jeśli count = 2wnioski będą takie

    Я могу подтянуться 2 раза.
  • jeśli count = 7wnioski będą takie

    Я могу подтянуться 7 раз.
Kod ten tworzy tablicę double[] filelimitsokreślającą limity wartości, przy których zmieni się wyjście ciągów. Tablica String[] filepartwskazuje same warianty ciągów, których można użyć. Warunki wyboru opcji liniowej z wartości zmiennej określa się następująco: opcja zostanie wybrana, filepart[j]jeśli filelimits[j] =< count < filelimits[j+1]. Następnie tworzony jest obiekt , a tablice przekazywane są ChoiceFormat fileformdo jego konstruktora . Za pomocą metody mówimy obiektowi , że gdy zostanie wywołana metoda , to dla indeksu 0 w szablonie wiersza zastosuj formatowanie określone w obiekcie . Cienki. W zasadzie być może już wpadłeś na pomysł, aby nigdy nie używać klasy Java , ale wiedz, że to nie wszystkie ciekawostki. Jest taki kod: double[] filelimitsString[] filepartform.setFormatByArgumentIndex(0, fileform)MessageFormat formformatChoiceFormat fileformMessageFormat
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));
Oto główna cecha tablicy Format[] testFormats. W tablicy tej dodajemy obiekty (implementujące klasę abstrakcyjną Format), które odpowiadają za formatowanie obiektów zdefiniowanych w tablicy Object[] testArgs. Format[] testFormatsJeśli obiekt nie wymaga formatowania, to null. pattform.setFormats(testFormats)Następnie używamy tej metody, aby poinformować obiekt MessageFormat pattform, że wszystkie indeksy we wzorcu wierszy powinny używać formatowania zdefiniowanego w tablicy Format[] testFormats. W tym przykładzie dane wyjściowe będą następujące:
There are no files on ADisk.
28.04.18 22:10
To wszystko i mam nadzieję, że nie będziesz miał żadnych trudności przy rozwiązaniu problemu 2412.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION