In diesem Artikel möchte ich über die Klasse sprechen
MessageFormat
, die in Aufgabe 2412 (task2412) verwendet wird. Die Klasse MessageFormat
dient zum Erstellen von Zeichenfolgen. Diese Java-Klasse nimmt eine Reihe von Objekten, formatiert sie und fügt dann die formatierten Zeichenfolgen an den entsprechenden Stellen in die Vorlage ein. Dies ist eine Art Alternative (oder sogar Ergänzung) zur statischen Methode String.format
. Zunächst ein einfaches Beispiel für die Verwendung dieser Java-Klasse, ohne ein Objekt zu erstellen, sondern eine statische Methode zu verwenden:
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);
Hier wird eine statische Methode aufgerufen MessageFormat.format
, an die als Argumente die String-Vorlage und tatsächlich Objekte übergeben werden, die an durch Klammern getrennten Stellen eingefügt werden {}
. In Klammern wird die Position des Objekts angegeben, bei der es beginnt 0
, sowie ggf. die Art der Formatierung. Die Ausgabe sieht folgendermaßen aus:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
Das folgende Beispiel erstellt bereits ein Objekt der Klasse 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));
Wenn ein Klassenobjekt erstellt wird, MessageFormat
wird eine Zeichenfolgenvorlage an seinen Konstruktor übergeben. Als nächstes wird beim Aufruf einer Methode format
für ein Objekt ein Array von Objekten, das in die String-Vorlage eingefügt wird, dort als Argument übergeben. Die Ausgabe sieht folgendermaßen aus:
The disk "MyDisk" contains 1 273 file(s).
Es kann auch sichergestellt werden, dass der gewünschte Text abhängig vom Wert der Variablen ausgewählt wird. Eine Art Implementierung des Operators if...else
, die nur die Klasse verwendet ChoiceFormat
. Hier ist der 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));
Dieser Code ändert abhängig vom Wert der Variablen count
die Ausgabe der Zeile wie folgt:
-
wenn
count = 1
die Schlussfolgerung so istЯ могу подтянуться 1 раз.
-
wenn
count = 2
die Schlussfolgerung so istЯ могу подтянуться 2 раза.
-
wenn
count = 7
die Schlussfolgerung so istЯ могу подтянуться 7 раз.
double[] filelimits
, das die Wertegrenzen angibt, bei denen sich die Ausgabe von Zeichenfolgen ändert. Und das Array String[] filepart
zeigt genau die Varianten der Zeichenfolgen an, die verwendet werden können. Die Bedingungen für die Auswahl einer Linienoption aus dem Variablenwert werden wie folgt bestimmt: Die Option wird ausgewählt, filepart[j]
wenn filelimits[j] =< count < filelimits[j+1]
. Als nächstes wird ein Objekt erstellt und Arrays ChoiceFormat fileform
an seinen Konstruktor übergeben . Mit der Methode teilen wir dem Objekt mit , dass beim Aufruf der Methode für den Index 0 in der Zeilenvorlage die Formatierung verwendet wird, die im Objekt angegeben wurde . Bußgeld. Im Prinzip haben Sie vielleicht schon die Idee, niemals eine Java-Klasse zu verwenden , wissen aber, dass das nicht alles ist. Es gibt diesen 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));
Hier ist das Hauptmerkmal des Arrays Format[] testFormats
. In diesem Array fügen wir Objekte hinzu (die die abstrakte Klasse implementieren Format
), die für die Formatierung der im Array definierten Objekte verantwortlich sind Object[] testArgs
. Format[] testFormats
Wenn das Objekt keine Formatierung benötigt, dann null
. pattform.setFormats(testFormats)
Als nächstes teilen wir dem Objekt mit der Methode mit MessageFormat pattform
, dass alle Indizes im Zeilenmuster die im Array definierte Formatierung verwenden sollen Format[] testFormats
. Für dieses Beispiel wäre die Ausgabe:
There are no files on ADisk.
28.04.18 22:10
Das ist alles und ich hoffe, dass Sie bei der Lösung von Problem 2412 keine Schwierigkeiten haben werden.
GO TO FULL VERSION