أريد في هذه المقالة أن أتحدث عن الفصل
MessageFormat
المستخدم في المهمة 2412 (المهمة 2412). تم تصميم الفصل MessageFormat
لإنشاء سلاسل. تأخذ فئة Java هذه مجموعة من الكائنات، وتقوم بتنسيقها، ثم تقوم بإدراج السلاسل المنسقة في القالب في المواقع المناسبة. يعد هذا نوعًا من البديل (أو حتى الإضافة) للطريقة الثابتة String.format
. أولاً، مثال بسيط لاستخدام فئة Java هذه دون إنشاء كائن، ولكن باستخدام طريقة ثابتة:
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);
هنا يُطلق على الطريقة الثابتة اسم MessageFormat.format
، حيث يتم تمرير قالب السلسلة، وفي الواقع، الكائنات التي سيتم إدراجها في الأماكن المحددة بين قوسين كوسائط {}
. يتم تحديد موضع الكائن بدءًا من بين قوسين 0
، بالإضافة إلى نوع التنسيق، إن وجد. سيكون الإخراج مثل هذا:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
المثال التالي يقوم بالفعل بإنشاء كائن من الفئة 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));
عندما يتم إنشاء كائن فئة، MessageFormat
يتم تمرير قالب سلسلة إلى منشئه. بعد ذلك، عند استدعاء أسلوب format
على كائن ما، يتم تمرير مصفوفة من الكائنات التي سيتم إدراجها في قالب السلسلة هناك كوسيطة. سيكون الإخراج مثل هذا:
The disk "MyDisk" contains 1 273 file(s).
ومن الممكن أيضًا التأكد من تحديد النص المطلوب اعتمادًا على قيمة المتغير. نوع من تنفيذ المشغل if...else
، فقط باستخدام الفئة ChoiceFormat
. إليك الكود:
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));
هذا الكود، اعتمادًا على قيمة المتغير، count
يغير مخرجات السطر كما يلي:
-
إذا كانت
count = 1
النتيجة مثل هذاЯ могу подтянуться 1 раз.
-
إذا كانت
count = 2
النتيجة مثل هذاЯ могу подтянуться 2 раза.
-
إذا كانت
count = 7
النتيجة مثل هذاЯ могу подтянуться 7 раз.
double[] filelimits
تحدد حدود القيم التي سيتغير عندها مخرجات السلاسل. ويشير المصفوفة String[] filepart
إلى متغيرات السلاسل التي يمكن استخدامها. يتم تحديد شروط اختيار خيار السطر من قيمة المتغير على النحو التالي: سيتم تحديد الخيار filepart[j]
إذا filelimits[j] =< count < filelimits[j+1]
. بعد ذلك، يتم إنشاء كائن ومصفوفات وتمريرها ChoiceFormat fileform
إلى مُنشئه . باستخدام الطريقة، نخبر الكائن أنه عند استدعاء الطريقة ، بالنسبة للفهرس 0 في قالب الصف، استخدم التنسيق المحدد في الكائن . بخير. من حيث المبدأ، ربما تكون لديك بالفعل فكرة عدم استخدام فئة Java مطلقًا ، لكن اعلم أن هذه ليست كل المزايا. يوجد هذا الكود : 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));
هنا هي الميزة الرئيسية في المصفوفة Format[] testFormats
. في هذه المصفوفة نضيف كائنات (تنفيذ الفئة المجردة Format
) المسؤولة عن تنسيق الكائنات المحددة في المصفوفة Object[] testArgs
. Format[] testFormats
إذا كان الكائن لا يحتاج إلى تنسيق، فسيتم null
. pattform.setFormats(testFormats)
بعد ذلك، نستخدم الطريقة لإخبار الكائن MessageFormat pattform
أن جميع الفهارس الموجودة في نمط الصف يجب أن تستخدم التنسيق المحدد في المصفوفة Format[] testFormats
. في هذا المثال، سيكون الإخراج:
There are no files on ADisk.
28.04.18 22:10
هذا كل شيء، وآمل ألا تواجه أي صعوبات عند حل المشكلة 2412.
GO TO FULL VERSION