W tym artykule chcę porozmawiać o klasie
MessageFormat
użytej w zadaniu 2412 (zadanie 2412). Klasa MessageFormat
przeznaczona 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 0
oraz 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, MessageFormat
do jego konstruktora przekazywany jest szablon ciągu. Następnie podczas wywoływania metody format
na 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, count
zmienia wynik linii w następujący sposób:
-
jeśli
count = 1
wnioski będą takieЯ могу подтянуться 1 раз.
-
jeśli
count = 2
wnioski będą takieЯ могу подтянуться 2 раза.
-
jeśli
count = 7
wnioski będą takieЯ могу подтянуться 7 раз.
double[] filelimits
określającą limity wartości, przy których zmieni się wyjście ciągów. Tablica String[] filepart
wskazuje 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 fileform
do 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[] 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));
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[] testFormats
Jeś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.
GO TO FULL VERSION