Java 1.6 には、NavigableSetインターフェイスがあります。TreeSet と ConcurrentSkipListSet の両方がこのインターフェイスを実装します。これは SortedSet のサブインターフェースであり、SortedSet を置き換えることを目的としています。
これで、この NavigableSet にコレクションができました。これで2 つのメソッドが用意されました。floorとCeilingは、それぞれ引数よりも小さいか大きい要素を返します。または、引数がある場合は equal を返し、そのような要素がない場合は null を返します。
これにより、次の行に沿って何かを行うことができます。
int closest(int arg) {
Integer ceil = set.ceiling(arg);
Integer floor = set.floor(arg);
if(ceil == null) { return floor; }
if(floor == null) { return ceil; }
int cdiff = ceil - arg;
int fdiff = arg - floor;
if(cdiff < fdiff) { return ceil; }
else { return floor; }
}
小さいサイズの配列の場合、この実装と他の実装の速度の違いはほとんどないことに注意してください。
大量の数値セットを扱っている場合は、二重にリンクされたボトム レベルを使用して、独自のスキップ リスト(きちんとしたデータ構造) を実装することを検討することをお勧めします。次に、値がない場合に値があるべき場所に到達し、下のレベルを簡単に上下に移動して、次に高い数値と低い数値を取得できます。