2011-02-07 15 views
0

私は、0より小さく開始して0より大きくなる整数の連続した順序付きシーケンスを持っています。たとえば...,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7です。私はこれらを繰り返しシーケンス3,6,9,12にマップする必要があります。初期条件はf(0)=3です。したがって、例えばf(-2)=9, f(-1)=12, f(0)=3, f(1)=6, f(2)=9, f(3)=12, f(4)=3のように。 Javaでこの操作を表現するコンパクトな方法があるので、剰余演算子(%)を使用してif/else文を避けることができますか?整数のシーケンスを繰り返しシーケンスにマップする

+0

は私には宿題のように聞こえます。それは...ですか? –

+0

Sean - いいえ、ちょうど私が日付計算を含むアプリケーションでやらなければならないことです。 – Abiel

答えて

1

私は否定的に処理するために以下のことをお勧めします数字。

public int f(int n, int ... sequence) { 
    int idx = n % sequence.length; 
    if (idx < 0) idx += sequence.length; 
    return sequence[idx]; 
} 


int x = f(n, 3,6,9,12); 

しかし、この特定の例でははるかに簡単な解決策があります。)

public int f(int n) { 
    return (n & 3) * 3 + 3; 
} 
+0

ありがとう、私は最後に非常に単純な解決法が好きです。正と負の数。 – Abiel

+0

私は、3つの3のは、予想される解決策の種類だと思う。 –

1
int repeatingSequence[] = { 3,6,9,12 }; 
int fZero = 0; 
int len = repeatingSequence.length; 

public int f(int n) { 
    return repeatingSequence[ (n % len + fZero + len) % len ]; 
} 

初期マッピング条件としてポジティブ、ネガティブ、およびすべてのfZeroで機能します。

+0

fZeroが0にならない場合の例を挙げることができますか? 0の場合は、式を短くできませんでしたか? –

+0

これは負の整数では機能しません。 – Abiel

+0

@Peterの場合、マッピングの初期条件は任意です。 OPの質問では '{0-> 3、1-> 6、2-> 9、3-> 12、4-> 3、...}'、 'fZero = fZero = 1; 'オフセットは1になるので、マッピングは' {0-> 6,1-> 9,2-> 12,3> 3、4-> 6、...}のようになります。 – davin

2

これは、サーバあなたの目的になります。

int repeatInt = 12 - ((11 - seqInt)*3) % 12 ; 

where repeatInt = 3,9,6 or 12, the output 
    and seqInt = a number from your sequence 

(私はPHPのコードを試してみました、およびJavaにそれを変更し、任意の文法ミスのために私を許して)

+0

ありがとう、これは正しく動作し、コンパクトです。 – Abiel

+0

DhruvPathak - より詳細な検査では、seqInt> = 12のときこの関数は機能しません。12,15,18,21の繰り返しシーケンスが返されます。 – Abiel