Java:搜索数组中最近的值

时间:2014-07-12 07:33:55

标签: java arrays algorithm

我有一个有序的大维度数组,例如:

[2.1,3.4,3.6,4.1]

现在我以某种方式生成双数字,例如:

3.51

我需要在Java中创建一个获取数组和数字的函数,并在这个数字的数组中给出最接近的值。在这个例子中3.6。

我怎样才能以最有效的方式做到这一点?因为我可以拥有300000双倍的数组并且需要经常进行此操作。然后,我无法进行简单的比较。

修改 我做了这个,在一些测试中结果是正确的,因为你是对的吗?

        int pos = Arrays.binarySearch(allTime.times, value);
        double out;

        if(pos >= 0)
        {
//          System.out.println(allTime.times[pos]);
            out = allTime.times[pos];
        }
        else if(pos == -1)
        {
//          System.out.println(allTime.times[0]);
            out = allTime.times[0];
        }
        else
        {
            int insertionPoint = -pos-1;
            if(insertionPoint < allTime.times.length)
            {
                if(allTime.times[insertionPoint] - value < value - allTime.times[insertionPoint-1])
//                  System.out.println(allTime.times[insertionPoint] );
                    out = allTime.times[insertionPoint];
                else
//                  System.out.println(allTime.times[insertionPoint-1] );
                    out = allTime.times[insertionPoint-1];
            }
            else
//              System.out.println(allTime.times[allTime.times.length -1]);
                out = allTime.times[allTime.times.length -1];
        }

2 个答案:

答案 0 :(得分:2)

Arrays.binarySearch也适用于数组中未包含的元素。

int pos = Arrays.binarySearch(arr, value);

如果未包含该值,则返回一个负值,该值描述该值的位置:(-(insertion point) - 1)

然后找到两个邻居值中的哪一个是正确的。

if(pos < 0)
{
  int insertionPoint = -pos-1;
  if(insertionPoint == arr.length) //value is bigger than every value in array
    //arr[insertionPoint-1] is the nearest value
  else if(insertionPoint == 0) //value is smaller than every value in array
    //arr[0] is the nearest value
  else if(value-arr[insertionPoint-1] < arr[insertionPoint]-value)
    //arr[insertionPoint-1] is the nearest value
  else
    //arr[insertionPoint] is the nearest value
}else
  //arr[pos] has the same value

索引insertPoint的值大于value。我还处理了值包含在数组中的情况。

答案 1 :(得分:1)

Jimmy T回答并未处理极端情况,例如搜索号码落在第0个索引之前或者是否超出最后一个索引。

以下是更正后的

     double searchNearest(double[] array, double searchNumber) {
    int pos = Arrays.binarySearch(array, searchNumber);
    if (pos >= 0)
        return searchNumber;
    else {
        int insertionPoint = -pos - 1;
        if (insertionPoint > 0 && insertionPoint < array.length) {
            if ((searchNumber - array[insertionPoint - 1]) < (array[insertionPoint] - searchNumber)) {
                return array[insertionPoint - 1];
            } else {
                return array[insertionPoint];
            }

        } else {

            return insertionPoint == 0 ? array[0] : array[array.length - 1];
        }
    }

}