Trong bài viết này tôi muốn nói về lớp
MessageFormat
được sử dụng trong nhiệm vụ 2412 (task2412). Lớp này MessageFormat
được thiết kế để tạo chuỗi. Lớp Java này nhận một tập hợp các đối tượng, định dạng chúng và sau đó chèn các chuỗi được định dạng vào mẫu tại các vị trí thích hợp. Đây là một loại thay thế (hoặc thậm chí bổ sung) cho phương thức tĩnh String.format
. Đầu tiên, một ví dụ đơn giản về việc sử dụng lớp Java này mà không tạo đối tượng mà sử dụng một phương thức tĩnh:
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);
Ở đây, một phương thức tĩnh được gọi MessageFormat.format
, trong đó mẫu chuỗi và trên thực tế là các đối tượng sẽ được chèn vào các vị trí được phân cách bằng dấu ngoặc đơn sẽ được truyền dưới dạng đối số {}
. Vị trí của đối tượng bắt đầu từ được chỉ định trong dấu ngoặc đơn 0
cũng như kiểu định dạng, nếu có. Đầu ra sẽ như thế này:
At 21:25:54 on 28 апр. 2018 г., there was a disturbance in the Force on planet 7.
Ví dụ sau đã tạo một đối tượng của lớp 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));
Khi một đối tượng lớp được tạo, MessageFormat
một mẫu chuỗi sẽ được chuyển tới hàm tạo của nó. Tiếp theo, khi gọi một phương thức format
trên một đối tượng, một mảng đối tượng sẽ được chèn vào mẫu chuỗi sẽ được truyền vào đó dưới dạng đối số. Đầu ra sẽ như thế này:
The disk "MyDisk" contains 1 273 file(s).
Cũng có thể đảm bảo rằng văn bản cần thiết được chọn tùy thuộc vào giá trị của biến. Một loại thực hiện của nhà điều hành if...else
, chỉ sử dụng lớp ChoiceFormat
. Đây là mã:
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));
Mã này, tùy thuộc vào giá trị của biến, count
thay đổi đầu ra của dòng như sau:
-
nếu
count = 1
kết luận là như thế nàyЯ могу подтянуться 1 раз.
-
nếu
count = 2
kết luận là như thế nàyЯ могу подтянуться 2 раза.
-
nếu
count = 7
kết luận là như thế nàyЯ могу подтянуться 7 раз.
double[] filelimits
chỉ định giới hạn của các giá trị mà tại đó đầu ra của chuỗi sẽ thay đổi. Và mảng String[] filepart
chỉ ra các biến thể của chuỗi có thể được sử dụng. Điều kiện để chọn một phương án dòng từ giá trị biến được xác định như sau: phương án sẽ được chọn filepart[j]
nếu filelimits[j] =< count < filelimits[j+1]
. Tiếp theo, một đối tượng được tạo và tạo các mảng rồi ChoiceFormat fileform
truyền cho hàm tạo của nó . Với phương thức này, chúng ta cho đối tượng biết rằng khi phương thức được gọi thì đối với chỉ mục 0 trong mẫu hàng, hãy sử dụng định dạng đã được chỉ định trong đối tượng . Khỏe. Về nguyên tắc, bạn có thể đã có ý tưởng không bao giờ sử dụng một lớp Java , nhưng hãy biết rằng đây không phải là tất cả những điều thú vị. Có mã này: 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));
Đây là tính năng chính trong mảng Format[] testFormats
. Trong mảng này, chúng ta thêm các đối tượng (triển khai lớp trừu tượng Format
) chịu trách nhiệm định dạng các đối tượng được xác định trong mảng Object[] testArgs
. Format[] testFormats
Nếu đối tượng không cần định dạng thì null
. pattform.setFormats(testFormats)
Tiếp theo, chúng ta sử dụng phương thức này để thông báo cho đối tượng MessageFormat pattform
rằng tất cả các chỉ mục trong mẫu hàng phải sử dụng định dạng được xác định trong mảng Format[] testFormats
. Đối với ví dụ này, đầu ra sẽ là:
There are no files on ADisk.
28.04.18 22:10
Chỉ vậy thôi và tôi hy vọng các bạn sẽ không gặp khó khăn gì khi giải bài toán 2412.
GO TO FULL VERSION