2010-11-29 14 views
0

私は次のコードを持っています。現在の時刻に最も近いjava millisecondsを見つける

for(int i=0; i<a.length; i++){ 
    diff[i] = a.getTime() - b.getTime(); 
} 

a.getTime() = time in array. 
b.getTime() = current time on computer. 

a.getTimeのどれが現在の時刻に最も近いのかを調べる最も良い方法は何でしょうか?

出力差分:

-143214521 
32942394 
-132931 
-21340 

ありがとうございます!

答えて

2

ジャスト(Math.absを使用して)違いの絶対値を維持し、それが発生したインデックスと一緒に、あなたがこれまで見てきた最小値を追跡します。例えば

long currentTime = b.getTime(); // Only call once, to be consistent 
long minAbsDiff = Long.MAX_VALUE; 
int minIndex = -1; 
for(int i=0; i < a.length; i++) { 
    diff[i] = a[i].getTime() - currentTime; 
    long abs = Math.abs(diff[i]); 
    if (abs < minAbsDiff) { 
     minAbsDiff = abs; 
     minIndex = i; 
    } 
} 

これは、あなたはまだ他の場所diff[i]が必要と仮定しています。そうしないとあなただけの差が最小とa値が必要な場合、及び、あなたはよりコンパクトにそれを書くことができます。

long currentTime = b.getTime(); // Only call once, to be consistent 
long minAbsDiff = Long.MAX_VALUE; 
WhateverType minContainer = null; 
for (WhateverType x : a) { 
    long abs = Math.abs(x.getTime() - currentTime); 
    if (abs < minAbsDiff) { 
     minAbsDiff = abs; 
     minContainer = x; 
    } 
} 
+0

Sigh。あなたの答えは美しいです(+1)。しかし、少なくとも私はタイプミスを発見しました。 :-)それは 'Long.MAX_VALUE'です –

+0

@ S.P.Floyd - seanizer:Doh!修正しました。 C#で私の心の半分を持っていた;) –

+0

そして今あなたはタイプミスの半分を修正しました:-) –

1

Math.abs(long)をそれぞれの結果に対して実行し、最も低い値を使用します。

ところで、あなたはおそらく一度だけb.getTime()をしたい(内部のABS()の値を配置し、並べ替え、それはArrays.sort()を使用して、タイプlong[]の配列を作成します)。

+0

はまた、あなたは '長い[]'配列を排除し、ちょうどれるかもしれませんこれまでに計算した最低値を記録しておきます。 –

+0

確かに、私のやり方はおそらく初心者にとっては簡単です。 –

+0

また、 'Long'型のリストを作成し、' Collections.min'を使うこともできます。 – dogbane

1
long min = Long.MAX_VALUE; 
long current = b.getTime(); 
int index = -1; 
for(int i=0; i<a.length; i++) { 
    long diff = Math.abs(current - a.getTime()); 
    if(diff < min) { 
    min = diff; 
    index = i; 
    } 
} 
+0

このソリューションもありがとうございます.. – SOer

関連する問題