במאמר זה אני רוצה לדבר על המחלקה
MessageFormat
המשמשת במשימה 2412 (משימה 2412). הכיתה MessageFormat
נועדה ליצור מחרוזות. מחלקה זו של Java לוקחת קבוצה של אובייקטים, מעצבת אותם, ואז מכניסה את המחרוזות המעוצבות לתבנית במקומות המתאימים. זהו סוג של חלופה (או אפילו תוספת) לשיטה הסטטית String.format
. ראשית, דוגמה פשוטה לשימוש במחלקת ג'אווה זו מבלי ליצור אובייקט, אלא באמצעות שיטה סטטית:
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 בתבנית השורה, השתמש בעיצוב שצוין באובייקט . בסדר גמור. באופן עקרוני, אולי כבר יש לך את הרעיון שלעולם לא להשתמש בכיתה ג'אווה , אבל דע שזה לא כל הפעמונים והשריקות. יש את הקוד הזה: 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