5

これは非常に単純な質問のように思えますが、驚くほどインターネット上に書かれておらず、自分で正しく実装するのに苦労しています。比較がアルファベットの終わりを「ラップアラウンド」するように、JavaでASCII文字にモジュラー比較関数を実装する最良の方法は何ですか? アルファベット全体を任意の場所で分割できる「between」関数に使用し、「y」が「x」と「b」の間にあるかどうかを尋ねられたときに正しく「true」を返すようにしたいと考えています。

文字の剰余算術に関するすべての質問と回答を既に見つけたので、次のようなコードで剰余加算 (文字シフト) を行う方法を知っています。

char shifted = (((original - 'a') + 1) % 26) + 'a';

ただし、これは Java のビルトインモジュラー算術関数に基づいており、比較できる同等のものはありません。単純な int を使用していたとしても、a < b < c mod 26 (a = 24、b = 25、および c = 1 の場合に true を返す必要があります) かどうかを Java に尋ねる方法はありません。

一般的な質問は、Java でモジュラー比較操作を実装する最良の方法は何かということです。それが難しすぎる問題である場合、ASCII アルファベットに対してそのような比較を機能させる方法は少なくともありますか?

4

3 に答える 3

2

循環キューでのテストでは、ラップアラウンドしたかどうかをA < B < Cいつでも想定できます。A <= B

の場合A < B、ラッピングは行われていません。どちらかB < C or C < Aの場合、B は A と C の間にあります。

の場合A > Bは、ラップされています。の場合B < C and C < A、B は A と C の間にあります。

A==B、B==C、または A==C を処理する方法を自分で定義する必要があります。

于 2012-07-08T22:24:47.583 に答える
1

だからあなたの質問は:アルファベットが折り返されているという条件で、文字とc_1の間に文字がありますか?c_2c_3

  • 各文字を数値に変換します(つまり、、、a = 1... b = 2z = 26)。あなたの例では、それはとのc_1 = 'y' = 25間です)。c_2 = 'x' = 24c_3 = 'b' = 2
  • の場合c_3 < c_2、に26を追加しc_3ます。あなたの例では、それはそうです2 < 24
  • 、、、がありc_1 = 25ます。c_2 = 24c_3 = 28
  • 成立するか確認してくださいc_1 >= c_2 && c_1 <= c_3。もしそうなら、キャラクターは2つの境界の間にあります。保持されない場合は、次の手順に進みます。
  • に26を追加しc_1、この値が上記のチェックを満たしているかどうかを確認します。その場合、文字はラップされた境界内にあります。それでも止まらない場合。

このアプローチでは、基本的に「2番目の」アルファベットに26を追加します。それで:

... 23 24 25 26 1 2 3 4

になります:

... 23 24 25 26 27 28 29 30

その後、通常どおりに算術演算を実行できます。

編集:MvGのコメントに基づいてアルゴリズムを更新しました。確かに複数の状況があります:「25は24と2の間にありますか?」だけでなく、「1は24と2の間ですか?」後者の場合、(1 + 26)が24と(2 + 26)の間にあるかどうかも確認する必要があります。これが当てはまるため、文字「a」は実際に「x」と「b」の間にあります。

于 2012-07-08T20:36:35.177 に答える
0

好みによっては、if ステートメントではなくモジュラス演算子を使用することもできます。1 行で比較を実行するには、次のようにします。

public static boolean isStrictlyBetween(char a, char x, char b) {
    // assuming x, a, and b are all the same case (lower or upper).
    return ((x - a + 26) % 26) < ((b - a + 26) % 26);
}

このコードは、a から x までの時計回りの距離が a から b までの時計回りの距離よりも小さい場合に true を返すように指示しています。+26 は、差分式の結果が正であることを保証します (一部の言語では、負の数の % が奇妙な動作をします)。% 26 は、希望するモジュラスを実行します。

于 2012-07-08T23:01:44.757 に答える