在数组中查找最接近的较高和较低的数字

时间:2014-06-09 10:35:15

标签: java arrays sorting compare

Heyo,

我实际上是尝试实现一个以整数作为输入的函数。 我也有一系列的上升整数。

现在我尝试找到与我的单个整数最接近的最接近的数字。

我想将它作为一个数组返回,但我只找到了一个解决方案来找到给定输入的最近一个数字。

public int getClosestTimeValue(int time) {
int nearest = -1;
int bestDistanceFoundYet = Integer.getInteger(null);
int[] array = null;     
// We iterate on the array...
for (int i = 0; i < array.length; i++) {
     // if we found the desired number, we return it.
if (array[i] == time) {
    return array[i];
    } else {
        int d = Math.abs(time - array[i]);
if (d < bestDistanceFoundYet) {
    nearest = array[i];
}
    }
}
    return nearest;
}

有谁知道如何在java中解决这个问题?

谢谢卢卡斯

3 个答案:

答案 0 :(得分:1)

目前您只搜索一次。要找到最接近的较低和最近的较高时间,您应该有两个变量。然后,您可以检查迭代时间是否低于或高于输入,并将值存储在相应的变量中。此时您只返回一个值,但为了返回多个值,您应该通过数组执行此操作。

我不确定它是否回答了你的问题,但这是我如何解决问题:

array = new int[]; // Array of times you have declared elsewhere.

// Method which returns the array of found times.
public int[] getClosestTime(int time) {
    int closestLowerTime = 0;
    int closestHigherTime = 100; // Value bigger than the largest value in the array.
    times = new int[2]; // Array for keeping the two closest values.
    // Iterating the array.
    for (int i = 0; i < array.length; i++) {
        // Finding the two closest values.
        int difference = time - array[i];
        if (difference > 0 && array[i] > closestLowerTime) {
            closestLowerTime = array[i];
        } else if (difference < 0 && array[i] < closestHigherTime) {
            closestHigherTime = array[i];
        }
    }
    times[0] = closestLowerTime;
    times[1] = closestHigherTime;
    return times;
}

这将找到最接近的较低和较高值,并将它们作为数组返回。目前我解决了它的时间在0到100之间,但是如果你不知道最大的时间值,你可以通过另一个循环找到它,迭代数组并将最大值存储在{{ 1}}。我没有找到通过数组返回确切值的正确方法,但它是否需要?

答案 1 :(得分:1)

如果不需要直接使用数组,则可以使用NavigableSet和ceiling()/ floor()方法来获取集合中最近的较大/较小元素。例如:

NavigableSet<Integer> values = new TreeSet<Integer>();
for (int x : array) { values.add(x); }
int lower = values.floor(time);
int higher = values.ceiling(time);

如果你需要使用数组(作业?),那么找一个关于二元搜索的好参考。

答案 2 :(得分:0)

由于数组已排序....

1) Check the middle two elements ..if both are less than the number check the left half (.i.e repeat step1)
else if both are greater than the number repeat step1 for right half...else the selected two numbers are your required answer