2012-07-08 14 views
5

これは非常に単純な質問のようですが、インターネット上で驚くほど少ないことが書かれています。比較の比較の機能をJavaのASCII文字に実装する最良の方法は、比較がアルファベットの末尾を包むようにすることです。私は任意の場所でアルファベット全体を分割することができ、 "y"が 'x'と 'b'の間にあるかどうか尋ねられたら正しく "true"を返す "between"関数に使用します。文字のモジュール比較

私はすでに文字のモジュラー算術について話すすべての質問と回答を見つけたので、私はこのようなコードでモジュラー加算(文字シフト)を行う方法を知っている:、しかし

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

これはJavaのモジュラ算術関数をベースにしています。これには比較のための等価物はありません。たとえ私が平文intを使っていたとしても、< b < c mod 26(a = 24、b = 25、c = 1ならtrueを返します)をJavaに問い合わせる方法はありません。

したがって、一般的な質問は、モジュール式のを実装する最良の方法は、Javaでの操作操作ですか?それが問題になるのはあまりにも難しいですが、少なくともASCIIアルファベットのためにそのような比較を行う方法はありますか?

+0

"モジュラ比較"はバイナリ比較には意味がないことに注意してください。モジュラ演算では「より小さい」順序はありません。 「間」のことはまだ可能ですが、あなたの質問レシピが有効です。 – MvG

答えて

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の処理方法を自分で定義する必要があります。

+0

これは非常に簡単です。文字の長さに依存しないので、マジックナンバー26を変更せずに文字列に句読点やUnicode文字を含めることができても、同じ機能を使用できます。 – Edward

+0

これはまた、匹敵するが必ずしも連続しているとは限らない値のアルファベット(16進数やbase64など)。 – phatfingers

1

あなたの質問は次のとおりです:文字とc_2c_3の間にアルファベットがラップアラウンドする場合、

  • 数(すなわち、a = 1b = 2、...、z = 26)に各文字を変換します。あなたの例では、c_1 = 'y' = 25c_2 = 'x' = 24c_3 = 'b' = 2の間です。
  • c_3 < c_2の場合は、c_3に26を加えます。あなたの例では、2 < 24が原因です。
  • c_1 = 25,c_2 = 24およびc_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のコメントに基づいてアルゴリズムを更新しました。確かに複数の状況があります。「24と2の間に25か」 "24と2の間に1か?"後者の場合、(1 + 26)が24と(2 + 26)の間であるかどうかを確認する必要があります。これは文字 'a'が本当に 'x'と 'b'の間にあるように保持されます。

+0

また、 'c_1'に26を加えて、それが範囲内にあるかどうかを確認する必要があります。 – MvG

+0

@MvG:ありがとう、私はより多くの情報で答えを更新しました。 –

0

あなたの嗜好によっては、文ではなくモジュラス演算子を使用することができます。

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); 
} 

このコードはxにから時計回り距離はAからBへの時計回りの距離よりも小さい場合はtrueを返すように述べている:単一の行で比較を実行するには、このような何かを行います。 +26は、差分式の結果が正であることを保証します(一部の言語では、負の数の%が奇妙に実行されます)。 %26は、あなたの希望するモジュラスを実行します。