こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[Objective-c]多次元配列のアクセス方法

[Objective-c]多次元配列のアクセスの仕方をご教授いただきたく思います

処理文
NSLog(@"%@",[ar objectAtIndex:1]);

※arは多次元配列

コンソールの表示結果
{
item1 ="aaa";
item2 ="bbb";
item3 ="ccc";
}

インターネットでは多次元配列のアクセスの仕方が見当たりませんでした。
この様な表示ではなく、この中のaaa,bbb,cccをそれぞれを明示的に取得する方法は存在しますでしょうか?
よろしくお願いいたします。

投稿日時 - 2011-10-31 19:17:44

QNo.7105437

すぐに回答ほしいです

質問者が選んだベストアンサー

失礼します。

質問者様の仰りたいのは下記のようなことでしょうか。
C++言語で書いた場合

CString ar[][3] = {
{"111","222","333"},
{"aaa","bbb","ccc"},
{"AAA","BBB","CCC"}
};

という配列を表示するのに

printf("%s",ar[1][1]);

//////結果///////
bbb



そうであるとして、回答を進めます。(違う場合はもう少し頑張って説明をしてみてください)

// 配列作成
NSArray *ar = [[NSArray alloc]initWithArray:[NSArray arrayWithObject:@"111",@"222",@"333",nil],[NSArray arrayWithObject:@"aaa",@"bbb",@"ccc",nil],[NSArray arrayWithObject:@"AAA",@"BBB",@"CCC",nil],nil];

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


ででると思います。(多分(笑))

用は多次元配列なんてクラスは特になく、
配列の要素が配列なだけで、


[ar objectAtIndex:1]
で出てくるものがNSArray型なので、
それに対してもう一回objectAtIndexしたったら
bbb
がでてくるよ見たいな感じですかね。

ちなみに、Objective-cはC言語も使えたりするので
char* ar[][3] = 最初に書いたやつ



NSString(@"%s",ar[1][1]);

でも出てくるはずですよ(多分(笑))

そんな感じで頑張ってください。

投稿日時 - 2011-11-03 19:05:46

お礼

ご解答ありがとう御座います。
この様な解答を望んでおりました。
ただしobjective-cには
NSString(@"%s",ar[1][1]);
というような記述はつかえませんでした。

投稿日時 - 2011-11-19 08:10:23

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

> どのような記述が必要なのかという質問です。

それはあなたが考えることであって、私(あるいは回答者全般)が考えることではありません。あなた自身が回答を導きだすために必要な情報を提示してきたつもりですが、まだ足りませんか?不足しているとするなら、「NSArrayは、NSArrayの要素になりうる」という点でしょうか?もっともそれは「NSArrayの要素は、Objective-Cのオブジェクトである」ということから容易に連想されるはずだと思います。

> もし勘違いしていたらご指摘ください。

あなたのなさろうとしている作業が、汎用性があるというのが、あなたの勘違いではないでしょうか?だれでもよくやる作業かというと、そうは思えません。だからネット検索しても見つからないし、CocoaやiOSのフレームワークにもありません。
あなたの意図と合致しているかどうかわかりませんが、イメージとしては表計算の処理に近いことではないかと思い浮かびます。
CSV形式のテキスト(カンマ、改行区切りあるいはスペース、改行区切りのテキスト)の処理には、NSScannerというクラスがあり、XML書類の処理にも、いくつかの専門クラスが用意されています。

投稿日時 - 2011-11-01 10:31:19

お礼

ありがとう御座いました。

投稿日時 - 2011-11-19 08:09:17

ANo.2

> 文字列を配列の要素に入れて、扱いたいと考えています。

べつに「使い方があまりよろしくない」ことはありませんよ。ごくごくふつうの、というか頻繁に行われる処理です。

まず、Objective-Cには「NSString」という、文字列のクラスがあります。このクラスから生成されるのはオブジェクトですから、NSArrayの要素になります。NSStringオブジェクトを、NSArrayオブジェクトに登録して、管理する。とくに注意が必要な処理、操作ではありません。きわめてスタンダードです。

文字列定数は、C言語とObjective-Cは異なります。同じではありません。C言語の文字列定数は、ごぞんじのとおり「"abc"」というように、ダブルクオートで囲みますが、Objective-Cの文字列定数は、ダブルクオートの前に「@」を付加し、C言語の文字列定数と区別します。

@"abc" ← Objective-Cの文字列定数。 "abc" ← C言語の文字列定数。

Objective-Cのプログラミングを実践していると、「@」が多用されることに気づくでしょう。「@interface ~ @end」、「@implementation ~ @end」、「@property」、「@selector」など。この記号は「コンパイラ指示子」と呼び、Objective-C特有の記述であることを、コンパイラに教えているものです。文字列定数につける「@」も、これがObjective-C文字列定数であることを示すコンパイラ指示子です。
C言語の文字列は、基本ASCIIコード(0~127の128文字)ですが、Objective-Cの文字列はユニコードベースになっています。NSStringインスタンスが保持する文字列は、もちろんC言語の文字列ではありません。Objective-C文字列定数からNSStirngインスタンスを生成するには、

NSString *myString = @"My String";

という、かなり手抜きな記述が可能です。(ちゃんと記述しようとすると、「NSString *myString = [[NSString alloc] initWithString: @"My String"];」となります)
C言語文字列からNSStringインスタンスを生成するには、メソッド「initWithCString:encoding:」を使います。

配列の要素となるNSStringが用意できたら、つぎはNSArrayに登録していきます。これで当初の目的が達成されます。
NSArrayには、要素数固定のNSArrayと、可変長のNSMutableArrtay(NSArrayのサブクラス)の2種類があります。NSMutableArrayインスタンスには、随時「addObject:」で要素を追加していけますが、NSArrayインスタンスでは、宣言、初期化時にいっきに要素を代入します。

NSArray *stringArray = [[NSArray alloc] initWithObjects: stringA, stringB, stringC, stringD, nil];

(要素の最後を「nil」で閉じることを忘れずに)
NSStringインスタンスは、やはりここでも手抜きが可能です。

NSArray *stringArray = [[NSArray alloc] initWithObjects: @"あいう", @"えおか", @"きくけ", @"こさし", nil];

NSARRayインスタンスから要素を参照するには、ごぞんじのように「objectAtIndex:」を使います。

投稿日時 - 2011-11-01 00:09:24

補足

細かくありがとうございます。

私の知識不足なのかイメージが伝わってないのかもしれませんが。

ar(Array型)に

配列|tem1|item2|item3
0 "111","222","333"
1 "aaa","bbb","ccc"
2 "AAA","BBB","CCC"

入っているとして。

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

と入力すると
{
item1 ="aaa";
item2 ="bbb";
item3 ="ccc";
}
と出力されます。


そこで出力結果が例えば要素1のitem2の"bbb"の部分だけを取りたい
となった時。
どのような記述が必要なのかという質問です。

もし勘違いしていたらご指摘ください。

投稿日時 - 2011-11-01 08:55:51

ANo.1

Objective-Cは、C言語の配列をそのまま使います。C言語とは別の配列がある訳ではありません。なので、多次元配列も、C言語のやり方で処理します。
Objective-Cのクラスには、コレクションクラスといって、NSArray、NSSet、NSIndexのような配列を扱うように見えるものがありますが、いずれも用途を特化したものです。NSArrayはObjective-Cオブジェクトしか要素にできませんし、NSSetは、そのNSArrayの亜種、NSIndexは、符号なしintのみ要素とし、負数や実数(浮動小数点数)を要素にできません。名前どおり、順番を扱うクラスです。
それとも、文字列を配列の要素に入れて、扱いたいというのが、お望みなのでしょうか?

投稿日時 - 2011-10-31 19:52:33

お礼

回答ありがとうございます。

使い方があまりよろしくないかもしれませんが、最後の一文の通り
文字列を配列の要素に入れて、扱いたいと考えています。

投稿日時 - 2011-10-31 21:58:26

あなたにオススメの質問