2013-03-08 62 views
0

我使用的是API來獲取列車的實際數據時間,並試圖獲取距離用戶輸入時間最近的列車時間,然後顯示該列車時間,並且接下來的4個列車准許列車運行。我正在閱讀信息,代碼完成了它應該做的事情,但是當我在7個單元格中查看數組中的一堆[]括號而不是計算出的數字時。有什麼建議麼?下面的代碼與API將Int附加到數組Matlab中

測試值: requestStationSelected = '大學%20City' 和requestEndStation = '羅斯林'

%this is the API link for the live data from Septa this will get 30 
%results and see which time is closer to the user entered time 
requestInfoSeptaLive = ['http://www3.septa.org/hackathon/NextToArrive/' requestStationSelected '/' requestEndStation '/30']; 

%Again tries to get the information and if there is a failure it will give 
%a probable cause and terminate the program 
try 
    getInfoSeptaLive = urlread(requestInfoSeptaLive); 
catch 
    if getInfoSeptaLive ~= '[]' 
     disp... 
      ('Either the arrival/depart stations dont quite match up or theres a server error. Try again.'); 
     return; 
    else 
     disp('Unable to fetch the information from Septa, please try again') 
     return; 
    end 
end 
%parses the information returned from the Live API 
dataReturnedFromLiveAPI = parse_json(getInfoSeptaLive); 
dataReturnedFromLiveAPI = dataReturnedFromLiveAPI{1}; 

%gets the size of the API in case there are no trains running 
sizeOfDataNoTrains = size(dataReturnedFromLiveAPI, 1); 
sizeOfData = size(dataReturnedFromLiveAPI, 2); 

counter = 0; 

for i = 1:sizeOfData 
    scanForClosestTime = dataReturnedFromLiveAPI{1,i}.orig_departure_time; 

    trainTimeGivenH = sscanf(scanForClosestTime, '%i'); 
    findColonTrain = strfind(scanForClosestTime, ':'); 
    trainTimeGivenMStr = scanForClosestTime(findColonTrain+1:4); 
    trainTimeGivenM = int32(str2num(trainTimeGivenMStr)); 
    trainDepartTimeM = (trainTimeGivenH(1,1) * 60) + (trainTimeGivenM); 

    differenceBetweenTimes = trainDepartTimeM - userEnteredMins; 
    if trainDepartTimeM < userEnteredMins 
     differenceBetweenTimes = userEnteredMins - trainDepartTimeM; 
    end 

    stopAtEndOfData = sizeOfData; 
    goodTimeFrame = 60; 
    closestTime = cell(1, stopAtEndOfData); 
    storeTheDifference = cell(1, stopAtEndOfData); 

    if(differenceBetweenTimes < 60) 
     if (counter < 5) 
      closestTime{i} = scanForClosestTime; 
      storeTheDifference{i} = differenceBetweenTimes; 
      counter = counter + 1; 
     end 
    end 
end 
+0

您可以給'requestStationSelected'和'requestEndStation'有效的值,這樣我們就可以看到問題是什麼樣子了?一個'[]'意味着一個空單元 - 通常,如果你先分配給{3}而沒有先用{1}和{2}做某件事,你會得到{[],[],value}。它看起來像是在你分配'nearestTime {i}'的地方發生的,但是不能運行我猜測的代碼。 – Floris 2013-03-09 00:54:14

+0

requestStationSelected ='University%20City'and requestEndStation ='Roslyn' – heinst 2013-03-09 00:59:09

回答

1

您分配for循環內的電池陣列:

for i = 1:sizeOfData 
    ... 
     closestTime = cell(1, stopAtEndOfData); 
     storeTheDifference = cell(1, stopAtEndOfData); 
    ... 
end 

這意味着你在循環的每一次迭代中都將它們變成了一個{[],[],[],[],[]...}的數組 - 所以除非最後一次迭代中有一個有效的「最接近的時間」,否則你的單元格數組將全部爲空數組 - 如果它確實,除最後一個元素外,其餘都是[]。

若要解決此問題,請將兩行移至之前開始的for循環。

第二個問題似乎是存儲結果的數組的索引。如果你只需要五個結果,我假設你想將它們存儲在數組的元素1 - 5中,而不是「只是任何」位置。我會更改代碼到

if (counter < 5) 
     counter = counter + 1; 
     closestTime{counter} = scanForClosestTime; 
     storeTheDifference{counter} = differenceBetweenTimes; 
    end 

但也許我誤解了你想如何處理?

無關你的問題,你可能想看看行

trainTimeGivenMStr = scanForClosestTime(findColonTrain+1:4); 

這是很可能的,這是不是你打算做 - 看響應的例子,我發現字符串"orig_departure_time":"11:57PM"。我希望findColonTrain == 3,使上面的線變得

trainTimeGivenMStr = scanForClosestTime(4:4); 
  • 只是一個單一的字符。 trainTimeGivenMStr = scanForClosestTime(findColonTrain +(1:4));或者你的意思是

    trainTimeGivenMStr = scanForClosestTime

這將變成

trainTimeGivenMStr = scanForClosestTime(4:7); 

使

trainTimeGivenMStr = '57PM'; 

我希望這三件事情幫助你得到它的所有工作!

編輯:有一個機會今天早上運行你的代碼 - 發現了一些其他問題。我在下面包含一個帶註釋的「工作」代碼:最大的問題很可能是您沒有在代碼中處理AM/PM。請注意,我使用了不同的json解析器 - 這稍微改變了幾行。我相信你可以把它放在一起按照你想要的方式工作。這會在所有單元格中返回有效數據。

dataReturnedFromLiveAPI = loadjson(getInfoSeptaLive); 
% next line not needed - loadjson returns struct array, not cell array 
%dataReturnedFromLiveAPI = dataReturnedFromLiveAPI{1}; 

%gets the size of the API in case there are no trains running 
sizeOfDataNoTrains = size(dataReturnedFromLiveAPI, 1); 
sizeOfData = size(dataReturnedFromLiveAPI, 2); 

counter = 0; 
stopAtEndOfData = sizeOfData; 
closestTime = cell(1, stopAtEndOfData); 
storeTheDifference = cell(1, stopAtEndOfData); 
userEnteredMins = 12*60+30; % looking for a train around 12:30 pm 

for ii = 1:sizeOfData 
    scanForClosestTime = dataReturnedFromLiveAPI(ii).orig_departure_time; 

    trainTimeGivenH = sscanf(scanForClosestTime, '%i'); 
    % since we'll be considering AM/PM, have to set 12 = 0: 
    if (trainTimeGivenH == 12), trainTimeGivenH = 0; end 
    findColonTrain = strfind(scanForClosestTime, ':'); 
    % change next line to get minutes plus AM/PM: 
    trainTimeGivenMStr = scanForClosestTime(findColonTrain+(1:4)); 
    % look at just minutes: 
    trainTimeGivenM = int32(str2num(trainTimeGivenMStr(1:2))); 
    % adjust for AM/PM: 
    if(trainTimeGivenMStr(3:4)=='PM'), trainTimeGivenH = trainTimeGivenH+12; end; 
    % compute time in minutes: 
    trainDepartTimeM = (trainTimeGivenH * 60) + (trainTimeGivenM); 

    differenceBetweenTimes = trainDepartTimeM - userEnteredMins; 
    if trainDepartTimeM < userEnteredMins 
     differenceBetweenTimes = userEnteredMins - trainDepartTimeM; 
    end 
    % added a couple of lines to see what is happening: 
    fprintf(1, 'train %d: depart %s - in minutes this is %d vs user entered %d\n', ... 
     ii, scanForClosestTime, trainDepartTimeM, userEnteredMins); 

    goodTimeFrame = 60; 

    if(differenceBetweenTimes < 600) 
     if (counter < 10) 
      counter = counter + 1; 
      closestTime{counter} = scanForClosestTime; 
      storeTheDifference{counter} = differenceBetweenTimes; 
     end 
    end 
end 
+0

這樣做效果更好,但只有前兩個最近的時間出現,其餘3個只是[]括號...任何想法爲什麼? – heinst 2013-03-09 20:38:22

+0

對於其他人來說,差異之間的差異是否大於60? – Floris 2013-03-09 22:39:08

+0

你最大的問題是沒有處理AM/PM。我用一個有效的代碼示例更新了我的答案。 – Floris 2013-03-11 14:00:32