0

APIを使用して列車の実際のデータ時間を取得し、ユーザーが入力した時刻に最も近い列車時刻を取得して、その列車時刻を表示しようとしています。次の4つの許可された列車が運行しています。私は情報を読んでいて、コードはそれが何をすべきかを調べていますが、配列を見ると、計算された数ではなく、7つのセルにある[]括弧の束です。助言がありますか?APIを使用したコードは以下のとおりです

テスト値:requestStationSelected ='University%20City'およびrequestEndStation ='Roslyn'

%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
4

1 に答える 1

1

forループ内にセル配列を割り当てます。

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

これは、ループのすべての反復で両方をの配列に変換することを意味します{[],[],[],[],[]...}-したがって、最後の反復に有効な「最も近い時間」が含まれていない限り、セル配列はすべて空の配列になります-含まれている場合は、最後の要素は[]のままです。

これを修正するには、2行をループの開始前に移動します。for

2番目の問題は、結果を格納する配列のインデックス付けにあるようです。5つの結果のみが必要な場合は、「任意の」場所ではなく、配列の要素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);
  • たった1文字。おそらくあなたは意味しました

    trainTimeGivenMStr = scanForClosestTime(findColonTrain +(1:4));

になります

trainTimeGivenMStr = scanForClosestTime(4:7);

となることによって

trainTimeGivenMStr = '57PM';

これらの3つのことが、すべてを機能させるのに役立つことを願っています。

編集:今朝あなたのコードを実行する機会がありました-他の多くの問題を発見しました。以下に、注釈付きの「機能する」コードを含めます。最大の問題は、コードで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
于 2013-03-09T03:55:11.487 に答える