お魚採集帳ちょっとリジェクト

Appleにリジェクトされたんじゃなくて
こちら側で一旦リジェクトして再度アップしました。

なんでかっていうと
以前使ってた潮位APIがまったく役に立たなくなったんで
新しく探して組み込んだんですが
これの取得方法で躓いてしまいやや妥協してアプリを作ってしまってアップしたんですが
それの解決方法が判ったんで、一旦引っ込めて再度アップしました。
ですんで更に1週間ほどアップデートが遅れるかもしれないという・・

ここからちょいと専門的な内容が続きまふ。

面倒くさい方、興味ないかた、ちんぷんかんぷんな方はスルーでorz

このアプリで今回採用したAPIは、全国潮汐データ WebAPIってとこの

APIを使用しました。
んで、このAPIはGETでリクエストを送るとXMLで帰ってきますです。
パラメータには潮位を調べる場所と日付を指定します。
で帰ってくるXMLがこれ
<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet>
<port_name>芝浦</port_name>
<lat>35.38</lat>
<lng>139.45</lng>
<year>2011</year>
<month>1</month>
<day>1</day>
<youbi>土</youbi>
<shiomei>中潮</shiomei>
<getsurei>26.3</getsurei>
<hinode>06:50</hinode>
<hinoiri>16:40</hinoiri>
<tsukinode>03:45</tsukinode>
<tsukinoiri>13:44</tsukinoiri>
<tide>03:45 159cm
08:29 119cm
13:50 174cm
21:16  18cm
</tide>
</ResultSet>
上から、港名、緯度、経度、年、月、日、曜日、月齢、日の出時間、日の入り時間、月の出時間、月の入り時間
最後に肝心な潮位のデータが入ってます。
で、このの部分で躓きました。
半角スペースと改行。
半角スペースも1個じゃなくcmの部分で合わせてるためか
2個だとか3個半角スペースが入ってしまって
最初.split使って試行錯誤したのですが
配列がめちゃめちゃで潮位のデータは8個なのに
なぜか配列の数は12個あるよ!とか9個だぉ!とかいいやがる
これじゃ使い物にならん・・・
ってことでここは神頼みってことでいつもお世話になってるFxUGに問いかけ。
そしたらmatch使ってみたら?って言われて
ご丁寧にコードまで教えてもらい(ぁ
実装したら完璧!
で、何がしたいのかっていうと
上の
<tide>03:45 159cm
08:29 119cm
13:50 174cm
21:16  18cm
</tide>
</ResultSet>
こいつを使いやすくするために
<tide>
<hoge>03:45</hoge>
<Array>159cm</hoge>
<Array>08:29</hoge>
<Array>119cm</hoge>
<Array>13:50</hoge>
<Array>174cm</hoge>
<Array>21:16</hoge>
<Array>18cm</hoge>
</tide>
</ResultSet>
と、こうしたい。
文字の表示だけなら水位の部分のcmは入っててもいいんだけど
その他にチャートライン(曲線グラフ)で表示させるために
cmの文字が邪魔なんで、こいつはreplace使ってどうにでもなる。
protected function resultHandler(event:ResultEvent):void{
var res:Object = xmldata.lastResult.tide;
var yArray:Array = res.toString().match(/\S+/g);
var myPattern:RegExp = /cm/;
var a:String,b:String,c:String,d:String,e:String,f:String;
a = yArray[1].replace(myPattern, "");
b = yArray[3].replace(myPattern, "");
c = yArray[5].replace(myPattern, "");
d = yArray[7].replace(myPattern, "");
var data:Array=
[{time:yArray[0],level:a},
{time:yArray[2],level:b},
{time:yArray[4],level:c},
{time:yArray[6],level:d},];
TideTime.dataProvider = data;
myText.text= 
"満潮: " + yArray[0]+" "+
"水位: " + yArray[1]+"\n"+
"干潮: " + yArray[2]+" "+
"水位: " + yArray[3]+"\n"+
"満潮: " + yArray[4]+" "+
"水位: " + yArray[5]+"\n"+
"干潮: " + yArray[6]+" "+
"水位: " + yArray[7];
}
こんな感じで使ってます。
しかしソース汚いわwww
なんかもうもっといい方法ある気がするけんど、今の頭じゃこれが精一杯(爆

8 comments

  • こんなんあるの知らなんだ、使ってみよ
  • エイジ
    ソース全部見てないけど、cmも削った配列得るなら、
    .match(/[\d:]+/g)
    で良いかと。
    で、あとでcm付きに戻すなら、正規表現か条件文で、
    「コロンを含まない数字のみの文字列に対して+’cm’」
    とやればOK。(コロンを含む文字列は時間なのでcmは足さない)
  • まんと
    色々と楽しんでいらっしゃる様子で ^^
  • ひでさん
    これ前の日記のアプリorz
  • エイジさん
    おぉぉ
    コメントではなんともお久しゅうございますw

    今ある頭で考えた末こうなりました。

    //XMLの内容をここで配列に
    yArray.toString().match(/[\d:]+/g);
    

    for(var k:int=0;k<yArray.length;k++){ //正規表現がまだ良くわかってません(汗 var str:String = ":"; var myPattern:RegExp = new RegExp(str); if(yArray[k].toString().match(myPattern)){ //配列の0と4番目に満潮のデータが入ってるんで //こんな分け方しか思いつきませんですたorz switch(k<yArray.length){ case k==0||k==4: myText.text+="満潮: "+yArray[k]+" "; break; default: myText.text+="干潮: "+yArray[k]+" "; } }else{ //ここで水位にcmを足してますが //エイジさんの意図してる内容と違う??? myText.text+="水位: "+yArray[k]+"cm\n";  } }

    ごちゃごちゃしすぎ?w
    最初for文で配列の内容を表示させてなくて
    myText.text=”満潮:”+ yArray[0]+””+”水位”+yArray[1];
    見たいな感じでやっとりました・・・
    for文で書きなおしてみますたらこうなりますた。
  • マントさん
    ASとobjective-cと頭の切り替えが最近眠気を誘いますw
    参考書なんか読んでると2ページ進むまでには眠たさMAXですorz
  • エイジ
    生成する文字列のフォーマットは固定で良いみたいですね。
    だったら最短最速でこれでどうかしら?

    var tide:Array = res.toString().match(/[\d:]+/g);

    for(var i in tide){
    myText.text += (!tide[i].match(‘:’))? ‘ 水位: ‘ + tide[i] + ‘cm\n’: (i % 4)? ‘干潮: ‘ + tide[i]: ‘満潮: ‘ + tide[i];
    }

    最速かどうかは怪しいけど、コードとしては4行です(強引か)

    コロン分岐はパターン作るまでも無いですね。
    正規表現は覚えると便利ですが、つい乱用しちゃうので、敢えて如何に無しで書けるか試すのも暇が潰せます(笑)
  • エイジさん
    おぉーすっげーーー!
    すごいっすorz
    三項条件演算子なんて初めてしりますた(汗
    そんなんあるんですね・・
    でもそれ使えるようになると偉い短いコードで色々書けちゃいますね
    勉強になりますたorz

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です