如何在不重复的情况下找到阵列中最接近的数字?

时间:2015-09-02 03:48:23

标签: javascript arrays

我正在制作一个简单的程序,确定下一班火车的时间。我有一个包含所有列车时间的阵列,我只是不知道如何确定哪个是最接近当前时间的,而不是过去。以下是我到目前为止的情况:

var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();

var time = hours + minutes;
console.log(time);

var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];

function nextTrain(time) {

}

在函数nextTrain()中,我应该只使用if-else语句,还是有更好的方法?

6 个答案:

答案 0 :(得分:5)

由于trainTimes数组是有序的,你可以遍历它们,直到你找到当前时间之后的第一个,然后中断。

function nextTrain(time) {
  for (i = 0; i<trainTimes.length; i++){
    if(trainTimes[i]>time){
     console.log("the next train is " + trainTimes[i]);
     break;
    }
  }
}

答案 1 :(得分:2)

var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();

var time = hours + minutes;
console.log(time);

// given sorted array.
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];

// returns nth train 
function nextTrain(num, arr) {
    n = 0
    while (arr[n] <= num){ // consider < vs. <=
      n++;
    }
    return arr[n];
}

console.log(nextTrain(time,trainTimes))

来自link

的想法

答案 2 :(得分:0)

我建议你在这里进行二进制搜索,因为你的数组已经排序了。您可以查看此link以获取有关实施的详细信息。

在弄清楚当前时间落在数组中的位置后,您可以计算当前时间与两个最近邻居的差异。这取决于当前时间在二叉树中的位置。无论如何,这种方法效率很高。

答案 3 :(得分:0)

你需要将你的小时数乘以100。

然后你可以尝试这样的事情:

nextTrain(time);

function nextTrain(time) {
    var timeFound = false;
    for(var i = 0; i < trainTimes.length; i++){
        if(time > trainTimes[i - 1] && time < trainTimes[i] && !timeFound ){
            console.log("Next train time is: " + trainTimes[i]);
            timeFound=true;
        }
    }
}

答案 4 :(得分:0)

我希望它可以帮助你

var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();

var time = hours + minutes;
console.log(time);

var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
var diff = new Array(12);
for (i = 0; i < trainTimes.length; i++) {
    diff[i] =Math.abs( time + trainTimes[i]);//difference
}
var diff_sort = diff.sort(function(a, b){return a-b});//acs sort
var nearestIndex = diff.indexOf(diff_sort[0]); 
var nearestValue = trainTimes[nearestIndex]; 
alert(nearestValue)

答案 5 :(得分:0)

请使用:

var nextTimeIndex = (trainsTimes.indexOf(time) >= trainsTimes.length) ? 0 : trainsTimes.indexOf(time) + 1;
var nextTrain = trainsTimes[nextTimeIndex];