我有一个有序的大维度数组,例如:
[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];
}
答案 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];
}
}
}