In questo articolo voglio parlare della classe
MessageFormat
utilizzata nell'attività 2412 (task2412). La classe MessageFormat
è progettata per creare stringhe. Questa classe Java prende un insieme di oggetti, li formatta e quindi inserisce le stringhe formattate nel modello nelle posizioni appropriate. Questa è una sorta di alternativa (o addirittura aggiunta) al metodo statico String.format
. Innanzitutto, un semplice esempio di utilizzo di questa classe Java senza creare un oggetto, ma utilizzando un metodo statico:
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);
Qui viene chiamato un metodo statico MessageFormat.format
, al quale vengono passati come argomenti il modello di stringa e, di fatto, gli oggetti che verranno inseriti in luoghi delimitati da parentesi {}
. Tra parentesi è specificata la posizione dell'oggetto a partire da 0
, così come il tipo di formattazione, se presente. L'output sarà simile al seguente:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
L'esempio seguente crea già un oggetto della classe 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));
Quando viene creato un oggetto classe, MessageFormat
un modello di stringa viene passato al suo costruttore. Successivamente, quando si chiama un metodo format
su un oggetto, viene passato come argomento un array di oggetti che verranno inseriti nel modello di stringa. L'output sarà simile al seguente:
The disk "MyDisk" contains 1 273 file(s).
È anche possibile assicurarsi che il testo richiesto venga selezionato in base al valore della variabile. Una sorta di implementazione dell'operatore if...else
, utilizzando solo la classe ChoiceFormat
. Ecco il codice:
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));
Questo codice, a seconda del valore della variabile, count
modifica l'output della riga come segue:
-
se
count = 1
la conclusione è questaЯ могу подтянуться 1 раз.
-
se
count = 2
la conclusione è questaЯ могу подтянуться 2 раза.
-
se
count = 7
la conclusione è questaЯ могу подтянуться 7 раз.
double[] filelimits
che specifica i limiti dei valori ai quali cambierà l'output delle stringhe. E l'array String[] filepart
indica proprio le varianti di stringhe che possono essere utilizzate. Le condizioni per selezionare un'opzione di linea dal valore della variabile sono determinate come segue: l'opzione sarà selezionata filepart[j]
se filelimits[j] =< count < filelimits[j+1]
. Successivamente, viene creato un oggetto e gli array ChoiceFormat fileform
vengono passati al relativo costruttore . Con il metodo, diciamo all'oggetto che quando viene chiamato il metodo , quindi per l'indice 0 nel modello di riga, utilizzare la formattazione specificata nell'oggetto . Bene. In linea di principio, potresti già avere l'idea di non utilizzare mai una classe Java , ma sappi che questo non è tutto. C'è questo codice: 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));
Ecco la caratteristica principale dell'array Format[] testFormats
. In questo array aggiungiamo oggetti (implementando la classe astratta Format
) che sono responsabili della formattazione degli oggetti definiti nell'array Object[] testArgs
. Format[] testFormats
Se l'oggetto non necessita di formattazione, allora null
. pattform.setFormats(testFormats)
Successivamente, utilizziamo il metodo per indicare all'oggetto MessageFormat pattform
che tutti gli indici nel modello di riga dovrebbero utilizzare la formattazione definita nell'array Format[] testFormats
. Per questo esempio, l'output sarebbe:
There are no files on ADisk.
28.04.18 22:10
Questo è tutto e spero che non avrai alcuna difficoltà nel risolvere il problema 2412.
GO TO FULL VERSION