この記事では、タスク 2412 (task2412) で使用されるクラスについて説明したいと思います
MessageFormat
。 このクラスは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
. 次に、メソッドを使用して、行テンプレート内のすべてのインデックスが array で定義された書式設定を使用する必要があることをオブジェクトに伝えpattform.setFormats(testFormats)
ます。この例の場合、出力は次のようになります。 MessageFormat pattform
Format[] testFormats
There are no files on ADisk.
28.04.18 22:10
以上です。問題 2412 を解くときに問題が発生しないことを願っています。
GO TO FULL VERSION