3

一方の値がもう一方の値の+または-2に等しいかどうかを確認しようとしています。

これは私が出くわしたものです。

    for (int lineNumber : errorLineList) {
        if (lineNumber == startLineNumber
                || lineNumber == (startLineNumber + 1)
                || lineNumber == (startLineNumber + 2)
                || lineNumber == (startLineNumber - 1)
                || lineNumber == (startLineNumber - 2)) {
            lineFound = true;
            break;
        }
    }

しかし、ここで許容値を5にしたい場合は、10個のチェックを追加する必要があります。

Javaでこれを行う他のエレガントな方法はありますか?

4

4 に答える 4

22

小さな丸め誤差が発生する可能性があるため、これは double を使用するときに必要になることがよくあります。

if(Math.abs(lineNumber - startLineNumber) <= 2)

2 から 5 まで変更できます。2 つの値の差が 2 未満の場合。つまり、-2、-1、0、1、2 のいずれかになります。

同様の解決策はdouble、次を使用して「同等性」をテストすることです

if(Math.abs(a - b) < ERR) // where ERR is 1e-4 or 1e-9

使用する ERR の適切な値は、状況によって異なります。

于 2012-09-12T08:27:21.847 に答える
6

あなたは価値観の違いに興味があります。どちらの値が高いかは気にせず、それらの違いに興味があるだけです。によって取得できlineNumber - startLineNumberます。それはいいことですが、正の値だけでなく負の値も生成します。したがって、この差の絶対値を取得すると、比較に使用できる距離が得られます。

if ( Math.abs( lineNumber - startLineNumber ) <= 10 ) {
   // values are in tolerance -10 .. +10, ... 21 values
   // the range of tolerance in now simple changeable by one number 
   //            .. the distance of values, which can be defined 
   //            as a constant wherever you want, 
   //            static final field, property file, ..
}
于 2012-09-12T08:26:41.990 に答える
1

もちろん:

int tolerance = 5; //or any other value you want...
for (int lineNumber : errorLineList) {
    if(lineNumber <= (startLineNumber + tolerance) &&
       lineNumber >= (startLineNumber - tolerance)){
        lineFound = true;
        break;
    }
}
于 2012-09-12T08:29:35.147 に答える
0

どうですか

if (lineNumber >= (startLineNumber - 2) && lineNumber <= (startLineNumber + 2))
于 2012-09-12T08:27:50.733 に答える