Sa artikulong ito gusto kong pag-usapan ang klase
MessageFormat
na ginagamit sa gawain 2412 (task2412). Ang klase MessageFormat
ay idinisenyo upang lumikha ng mga string. Ang Java class na ito ay kumukuha ng isang set ng mga bagay, i-format ang mga ito, at pagkatapos ay ilalagay ang mga na-format na string sa template sa mga naaangkop na lokasyon. Ito ay isang uri ng alternatibo (o kahit na karagdagan) sa static na pamamaraan String.format
. Una, isang simpleng halimbawa ng paggamit ng Java class na ito nang hindi lumilikha ng isang bagay, ngunit gumagamit ng isang static na pamamaraan:
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);
Narito ang isang static na paraan ay tinatawag na MessageFormat.format
, kung saan ang string template at, sa katunayan, ang mga bagay na ipapasok sa mga lugar na nililimitahan ng mga panaklong ay ipinapasa bilang mga argumento {}
. Ang posisyon ng bagay na nagsisimula sa ay tinukoy sa panaklong 0
, pati na rin ang uri ng pag-format, kung mayroon man. Ang output ay magiging ganito:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
Ang sumusunod na halimbawa ay lumilikha na ng object ng klase 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));
Kapag ginawa ang isang object ng klase, MessageFormat
isang string na template ang ipinapasa sa constructor nito. Susunod, kapag tumatawag ng isang pamamaraan format
sa isang bagay, isang hanay ng mga bagay na ilalagay sa template ng string ay ipinapasa doon bilang isang argumento. Ang output ay magiging ganito:
The disk "MyDisk" contains 1 273 file(s).
Posible ring tiyakin na ang kinakailangang teksto ay napili depende sa halaga ng variable. Isang uri ng pagpapatupad ng operator if...else
, gamit lamang ang klase ChoiceFormat
. Narito ang 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));
Ang code na ito, depende sa halaga ng variable, count
ay nagbabago sa output ng linya tulad ng sumusunod:
-
kung
count = 1
ganito ang conclusionЯ могу подтянуться 1 раз.
-
kung
count = 2
ganito ang conclusionЯ могу подтянуться 2 раза.
-
kung
count = 7
ganito ang conclusionЯ могу подтянуться 7 раз.
double[] filelimits
na tumutukoy sa mga limitasyon ng mga halaga kung saan ang output ng mga string ay magbabago. At ang array String[] filepart
ay nagpapahiwatig ng mismong mga variant ng mga string na maaaring gamitin. Ang mga kundisyon para sa pagpili ng opsyon sa linya mula sa variable na halaga ay tinutukoy bilang mga sumusunod: ang opsyon ay pipiliin filepart[j]
kung filelimits[j] =< count < filelimits[j+1]
. Susunod, ang isang bagay ay nilikha at mga array at ChoiceFormat fileform
ipinapasa sa constructor nito . Gamit ang pamamaraan, sasabihin namin sa object na kapag tinawag ang pamamaraan , pagkatapos ay para sa index 0 sa template ng row, gamitin ang pag-format na tinukoy sa object . ayos lang. Sa prinsipyo, maaaring mayroon ka nang ideya na hindi kailanman gumamit ng isang klase ng Java , ngunit alamin na hindi ito ang lahat ng mga kampanilya at sipol. Mayroong code na ito: 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));
Narito ang pangunahing tampok sa array Format[] testFormats
. Sa array na ito nagdaragdag kami ng mga bagay (nagpapatupad ng abstract na klase Format
) na responsable para sa pag-format ng mga bagay na tinukoy sa array Object[] testArgs
. Format[] testFormats
Kung ang bagay ay hindi nangangailangan ng pag-format, pagkatapos ay null
. pattform.setFormats(testFormats)
Susunod, ginagamit namin ang paraan upang sabihin sa object MessageFormat pattform
na dapat gamitin ng lahat ng mga index sa template ng row ang pag-format na tinukoy sa array Format[] testFormats
. Para sa halimbawang ito, ang output ay magiging:
There are no files on ADisk.
28.04.18 22:10
Iyon lang, at umaasa ako na hindi ka mahihirapan sa paglutas ng problema 2412.
GO TO FULL VERSION