ページ 11

iPhoneアプリで多次元配列のカウント

Posted: 2010年11月16日(火) 16:20
by STY
DataViewController.mで多次元配列の様な物を作っているのですが
この場合、カウントが使えません。(強制的に落ちてしまいます)
わかりやすい様にサンプルソースを作ってみました。
http://www1.axfc.net/uploader/Sc/so/174004
pass:test

アクセスエラー?
// NSLog( @"%d", [myData count] );
// NSLog( @"%d", [[myData count] objectAtIndex:0] );

多次元の場合はcount等は使えないのでしょうか?

又、サンプルソースではCSVを読み取っているのですが
このCSVを読み取る関数を修正して
2列目に○の文字が含まれてたら配列に代入すると言った処理をしたいです。
考えてみたのですが良く理解できませんでした・・・。
例)1,ア,IR(アイアール),"IRとは~
で2列目にアが含まれているのでアが選択されたときのみ配列に入れる様にする。
逆にカ行が選択されたらカのみが配列に入る様にする。

何が押されたかはゲッターを使えばわかるのですが
この読み込み?の部分がわかりません。

わかりにくい質問なのですが参考になりそうなサイトもなくこちらで質問させて頂きました。
こちらはゲームを作る専用のサイトかと思うのですが頼る人がいないので
詳しい方がおりましたらアドバイスを頂けますと助かります。

開発言語:objective-C
環境:x-code
言語の理解度:初心者 構文がギリギリ理解できる程度

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月17日(水) 02:18
by Justy
>多次元の場合はcount等は使えないのでしょうか?
 1つ目の [color=##d0d0ff][myData count][/color] は動くと思いますけど。
 強いて言うなら、 %d じゃなくて %u です。

 多次元配列というのは文字列を1つの配列と見なした場合の話ですか?
 文字列の配列において、各文字にアクセスする場合は

NSLog( @"%@", [[myData objectAtIndex:0] objectAtIndex:1]);

というところです。


>○の文字が含まれてたら
 その条件でいいのならhttp://developer.apple.com/library/ios/ ... tring.htmlで判定して、入っていたら配列に入れればいいかと。

 まぁ csvを見る限り1文字しかないんで、==で比較してもいいかと思いますけど。

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月17日(水) 05:18
by STY
countの方は配列のnilにアクセスしていたのでおこっていたみたいです。
下記の様に変更した所、問題なく動きました><
if( indexPath.row < [myData count]-2 ) cell.textLabel.text = [[myData objectAtIndex:indexPath.row] objectAtIndex:2];

又、読み取りを紹介して頂いた関数の使い方がわからなかったので
下記の様に変更してみました。
一度setという変数に代入してからといった方法にしているのですが
この方法では落ちてしまいます・・・。
色々とやり方を考えてみたのですがイマイチいい回答が出ませんでした。
// CSVファイルを変数に格納
    NSMutableArray* csv = [[NSMutableArray alloc] init];
    for(int i=0; i<[lines count]; i++){
        NSMutableArray* set = [[NSMutableArray alloc] init];
        [set addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];
        if( [[set objectAtIndex:i] objectAtIndex:1]] == @"ア" )[csv addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];
        [set release];
    }

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月18日(木) 02:07
by STY
上げさせていただきます><

if( indexPath.row < [myData count]-2 ) cell.textLabel.text = [[myData objectAtIndex:indexPath.row] objectAtIndex:2];
はmyDataの終端にnilが入ってるから-2であってますよね?
解釈が違ったらすみません・・・。

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月18日(木) 02:56
by Justy
>この方法では落ちてしまいます
 落ちるのはアクセス範囲をチェックしていないからです。

 コンパイルしてないですが、こんな感じでしょう。

NSMutableArray* csv = [[NSMutableArray alloc] init];
for(int i=0; i<[lines count]; i++){
NSMutableArray* set = [[NSMutableArray alloc] init];
[set addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];

NSMutableArray *subSet = [set objectAtIndex:0];
if([subSet count] >= 2)
{
NSString * str = [subSet objectAtIndex:1];
if([str isEqual:(@"ア")])
[csv addObject:set];
}
[set release];
}




>myDataの終端にnilが入ってるから-2であってますよね
 [myData count]の数には nilの分は含まれません。

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月18日(木) 09:13
by STY
Justy様

何度も回答ありがとう御座います。
objective-cは本当にわからないので助かります。
サンプルソースもありがとうございます。
頂いたソースを元に変更してみたのですが
[self itemSet:csv];の部分で落ちてしまいます。

2010-11-18 09:08:42.907 Business[273:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 2 beyond bounds [0 .. 0]'
のようなエラーコードがでおります。
-(void)itemSet:(NSMutableArray*)srcItems{
    if(myData == srcItems)
        return;
    
    [myData release];
    myData = [srcItems copy];
} 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /*
    csvLoad *csv = [[csvLoad alloc] init];
    NSString* path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"csv"];
    [csv Load:path];
    */
    // ファイルの読み込み
    NSString* path = [[NSBundle mainBundle] pathForResource:@"biz" ofType:@"csv"];
    NSError* error = nil;
    int enc = NSUTF8StringEncoding;
    NSString* text = [NSString stringWithContentsOfFile:path encoding:enc error:&error];
    NSArray* lines = [text componentsSeparatedByString:@"\n"];    // ファイルの分割
    
    // CSVファイルを変数に格納
    NSMutableArray* csv = [[NSMutableArray alloc] init];
    for(int i=0; i<[lines count]; i++){
        NSMutableArray* set = [[NSMutableArray alloc] init];
        [set addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];
        
        NSMutableArray *subSet = [set objectAtIndex:0];
        if([subSet count] >= 2)
        {
            NSString * str = [subSet objectAtIndex:1];
            if([str isEqual:(@"ア")])
                [csv addObject:set];
        }
        [set release];
    }
//    NSLog( @"%@", [[csv objectAtIndex:1]objectAtIndex:0] );
//    [self itemSet:csv];
またnilはカウントされないのですか・・・
なぜ-2しなければいけないのかがわかりません・・・
変な値が入っているのでしょうか?

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月19日(金) 01:06
by Justy
 まず1点。
 
 昨日のコードは見直して見たらちょっとおかしかったですね。
  [color=##d0d0ff][csv addObject:set][/color] [color=##d0d0ff][csv addObject:subSet][/color] ですね。


 というかそもそものところで
>[set addObject:[[lines objectAtIndex:i] componentsSeparatedByString:@","]];
setに対して addObjectする必要すらないです。

 つまり、

for(int i=0; i<[lines count]; i++)
{
const NSArray *strArray = [[lines objectAtIndex:i] componentsSeparatedByString:@","];
if([strArray count] >= 2)
{
const NSString *str = [strArray objectAtIndex:1];
if([str isEqual:(@"ア")])
[csv addObject:strArray];
}
}

 これで十分事足りるはずです。



 さて
>[self itemSet:csv];の部分で落ちてしまいます
とのことですが、エラーメッセージと少し食い違っている様です。
 エラーメッセージの方は NSMutableArrayオブジェクトへの範囲外のアクセスによるエラーとあるので
[self itemSet:csv]でエラーになっているとはちょっと考えがたいです。

 もう一度確認してみて下さい。


> if( indexPath.row < [myData count]-2 ) cell.textLabel.text = [[myData objectAtIndex:indexPath.row] objectAtIndex:2];
>なぜ-2しなければいけないのかがわかりません
 このコードはどこの話をしていますか?
 雰囲気的には cellForRowAtIndexPathな気もしなくもないですが……。

 何にせよ、-2している理由はこちらではわかりません。
 特にする必要があるとは思えませんが、何かしらの意図があるのかもしれません。
 コードの製作者に意図を確認した方がいいでしょう。

Re:iPhoneアプリで多次元配列のカウント

Posted: 2010年11月19日(金) 16:38
by STY
Justy様
頂いたソースで出来ました><
問題なく動いております。

本当にありがとうございました。
なぜ-2しているかはわかりませんので調べてみます。