0

私が書いているフォームに対して検証する必要がある次の(簡略化された)条件があります:

a> b

a> c

a> d

b> c

b> d

c> d

グラフィカルに、これは次のように見ることができます。

ここに画像の説明を入力してください

ユーザーはa、b、c、およびdの値を自由に入力できます。そのため、これらのルールに従っていることを確認するために検証する必要があります。私が抱えている問題は、各ステートメントを明確かつ効率的に評価するものを書くことです。もちろん、最も明白な方法は、各ステートメントをifステートメントとして個別に評価することです。残念ながら、これには多くのコード行が必要であり、ほとんど同じことを行う一連のifブロックでメソッドを乱雑にすることは避けたいと思います。配列を使用して、次のネストされたforループソリューションを思いつきました。値の配列を作成し、それを2回ループしました(Pythonのような擬似コードで示されています)。

A = [a, b, c, d]
for i in range(3):
    for j in range(i, 4):
        if i > j and A[i] >= A[j]:
            print("A[i] must be less than A[j]")
        else if i < j and A[i] <= A[j]:
            print("A[j] must be greater than A[i]")

このソリューションで私が抱えている問題は、読みにくく、理解しにくいことです。ソリューションは明確ではありません。

私はそこにもっと良い、より明確な答えがあるというこのしつこい感じを持っています、しかし私は私の人生のためにそれを考えることができません。これは宿題でも何でもありません。私は実際にプロジェクトに取り組んでおり、この問題(またはその微妙なバリエーション)が複数回発生したため、明確で効率的な再利用可能なソリューションを作成したいと思います。任意の入力をいただければ幸いです。ありがとう!

4

3 に答える 3

6
if a > b > c > d:
    do ok
else:
    for x in range(3):
        if A[i] <= A[i+1]:
             print A[i], ' not greater than', A[i+1]
于 2012-08-22T16:39:52.277 に答える
2

比較の推移性を想定できない場合:

from itertools import combinations
for x, y in combinations(A, 2):
    if x <= y:
        print("{} not greater than {}".format(x, y))

それ以外の場合は、fpの解が最適です。

于 2012-08-22T16:46:29.017 に答える
0

チェックごとにデリゲートを作成し、それらを配列に追加できます。bool LargerCheck(a、b、string error)のような適切なデリゲートを作成し、それらをループできる配列に追加します...

しかし、より読みやすい場合は、多くの作業とより複雑です。面倒なチェックを単一の検証ブロックに隠し、通常のコードで読みやすい単一のチェックを作成するだけだと思います。このようなもの;

// Simple readable check in normal code
if (!ValidationOk(a,b,c,d,response) 
{
  ShowResponse(response);
  Break;
}


// messy routine
private bool ValidationOk(a,b,c,d,List<string> valerrors)
{
  valerrors.Clear();
  if (a<b) valerrors.Add("a < b");
  if (a<c) valerrors.Add("a < c");
  ....
  return valerrors.Count == 0;
}
于 2012-08-28T13:31:52.767 に答える