Find the index of the value nearest to the key. : Array Sort Search « Collections Data Structure « Java






Find the index of the value nearest to the key.

        
import java.util.Arrays;


/**
 * <p>Static methods for doing useful math</p><hr>
 *
 * @author  : $Author: brian $
 * @version : $Revision: 1.1 $
 *
 * <hr><p><font size="-1" color="#336699"><a href="http://www.mbari.org">
 * The Monterey Bay Aquarium Research Institute (MBARI)</a> provides this
 * documentation and code &quot;as is&quot;, with no warranty, express or
 * implied, of its quality or consistency. It is provided without support and
 * without obligation on the part of MBARI to assist in its use, correction,
 * modification, or enhancement. This information should not be published or
 * distributed to third parties without specific written permission from
 * MBARI.</font></p><br>
 *
 * <font size="-1" color="#336699">Copyright 2002 MBARI.<br>
 * MBARI Proprietary Information. All rights reserved.</font><br><hr><br>
 *
 */

public class Util{

    /**
     * Find the index of the value nearest to the key. The values array can
     * contain only unique values. If it doesn't the first occurence of a value
     * in the values array is the one used, subsequent duplicate are ignored.
     *
     * @param values Values to search through for the nearest point.
     * @param key The key to search for the nearest neighbor in values.
     * @return the index of the value nearest to the key.
     * @since 20011207
     */
    public static final int near(final double[] values, final double key) {

        int n = binarySearch(values, key);
        if (n < 0) {
            // when n is an insertion point
            n = (-n) - 1; // Convert n to an index
            // If n == 0 we don't need to find nearest neighbor. If n is
            // larger than the array, use the last point in the array.
            if (n > values.length - 1) {
                n = values.length - 1; // If key is larger than any value in values
            }
            else if (n > 0) {
                // find nearest neighbor
                double d1 = values[n - 1] - key;
                double d2 = values[n] - key;
                if (d1 <= d2) {
                    n = n - 1;
                }
            }
        }
        return n;
    }

    /**
     * Searches the specified array of doubles for the specified value using
     * the binary search algorithm.  The array <strong>must</strong> be sorted
     * (as by the <tt>sort</tt> method, above) prior to making this call.  If
     * it is not sorted, the results are undefined.  If the array contains
     * multiple elements with the specified value, there is no guarantee which
     * one will be found. The array can be sorted from low values to high or
     * from high values to low.
     *
     * @param a the array to be searched.
     * @param key the value to be searched for.
     * @return index of the search key, if it is contained in the list;
     *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
     *         <i>insertion point</i> is defined as the point at which the
     *         key would be inserted into the list: the index of the first
     *         element greater than the key, or <tt>list.size()</tt>, if all
     *         elements in the list are less than the specified key.  Note
     *         that this guarantees that the return value will be &gt;= 0 if
     *         and only if the key is found.
     */
    public static int binarySearch(double[] a, double key) {
        int index = -1;
        if (a[0] < a[1]) {
            index = Arrays.binarySearch(a, key);
        }
        else {
            index = binarySearch(a, key, 0, a.length - 1);
        }
        return index;
    }

    private static int binarySearch(double[] a, double key, int low, int high) {
        while (low <= high) {
            int mid = (low + high) / 2;
            double midVal = a[mid];

            int cmp;
            if (midVal > key) {
                cmp = -1; // Neither val is NaN, thisVal is smaller
            }
            else if (midVal < key) {
                cmp = 1; // Neither val is NaN, thisVal is larger
            }
            else {
                long midBits = Double.doubleToLongBits(midVal);
                long keyBits = Double.doubleToLongBits(key);
                cmp = (midBits == keyBits ? 0 : (midBits < keyBits ? -1 : 1)); // (0.0, -0.0) or (NaN, !NaN)
            }

            if (cmp < 0) {
                low = mid + 1;
            }
            else if (cmp > 0) {
                high = mid - 1;
            }
            else {
                return mid; // key found
            }
        }
        return -(low + 1); // key not found.
    }
}

   
    
    
    
    
    
    
    
  








Related examples in the same category

1.Quicksort implementation for sorting arrays
2.Search for a specified value of an array
3.Inserting an Element into a Sorted Array
4.How to sort an array
5.Sorting an Array in Descending (Reverse) Order
6.Sort in reverse order
7.Sorting an Array
8.Finding an Element in a Sorted Array
9.Sort array values in descending order
10.Find items in an array
11.Reverses the order of the given object array.
12.Reverses the order of the given long type value array.
13.Reverses the order of the given int type value array.
14.Reverses the order of the given short type value array.
15.Reverses the order of the given char type value array.
16.Reverses the order of the given byte type array.
17.Reverses the order of the given double value type array.
18.Reverses the order of the given float type value array.
19.Reverses the order of the given boolean type value array.
20.Produces a new array containing the elements between the start and end indices.
21.Produces a new long array containing the elements between the start and end indices.
22.Produces a new int array containing the elements between the start and end indices.
23.Produces a new short array containing the elements between the start and end indices.
24.Produces a new char array containing the elements between the start and end indices.
25.Produces a new byte array containing the elements between the start and end indices.
26.Produces a new double array containing the elements between the start and end indices.
27.Produces a new float array containing the elements between the start and end indices.
28.Produces a new boolean array containing the elements between the start and end indices.
29.Get index of long type array
30.Get the index and last index of an int type value array
31.Get the index and last index of a short type value array
32.Get the index and last index of a char type value array
33.Get the index and last index of byte type array
34.Get the index and last index of a double type array
35.Get the element index and last index in a float type value array
36.Get the element index or last index among a boolean type array
37.Finds the index of the given object in the array starting at the given index.
38.Finds the index of the given object in the array.
39.Returns the index in the source array where the first occurrence of the specified byte pattern is found
40.Returns the index in the source array where the first occurrence of the specified text (a String, converted to a byte array) is found
41.Returns the index in the source array where the last occurrence of the specified byte pattern is found
42.Returns the index in the source array where the last occurrence of the specified text (a String, converted to a byte array) is found
43.Returns the maximum value in a byte-type array.
44.Returns the maximum value in a double-type array.
45.Returns the maximum value in a float-type array.
46.Returns the maximum value in a long-value array.
47.Returns the maximum value in a short-type array.
48.Returns the maximum value in an int-type array.
49.Returns the minimum value in a double-type array.
50.Returns the minimum value in a float-value array.
51.Returns the minimum value in a short-type array.
52.Returns the minimum value in an array.
53.Returns the minimum value in an int-type array.
54.Returns the minimum value in an short-type array.
55.Search for an object in an array.
56.Finds the last index of the given object in the array starting at the given index.
57.Finds the last index of the given object within the array.
58.If array contains given element
59.Sort array utilities
60.Check if object 1 contains object 2
61.Returns the number of times a value occurs in a given array
62.Get the index of an array element
63.Sorts parts of the given array with the quicksort algorithm using the given comparator.
64.Return true if the array contains the element.
65.Searches the specified array of doubles for the specified value using the binary search algorithm.
66.Calculate the minimum and maximum values out of a list of doubles