• ベストアンサー

【Doja】自作クラスの可変長配列を使いたい

【Doja】自作クラスの可変長配列を使いたい Doja5.0でiアプリを開発しています。 自作クラスを要素とする可変長配列を使いたいと思いArrayListを使おうと思ったら、GenericsはDojaではコンパイル通らないようで。(http://okwave.jp/qa/q3136314.html) そこで、自作クラスの可変長配列を使いたい場合、どうすればいいでしょうか?

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

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

リンク先の回答通りであればジェネリクスのあるなし以前にArrayListそのものが存在しないわけで、 その場合、可変長配列としてVectorクラスを使えばいいのでは? ただし、ジェネリクスが言語仕様に加わる前のプログラミングのやり方、 elementAt等で取り出した要素はObjectなので適宜キャストする(その自作クラス型でキャスト)とか、 addElementで付け加える時には型による制限無しに参照型なら何でも入るので注意する(自作クラスオブジェクトしか入れないようにする)とか、 そういった点に注意しながら組む必要がある。

Kujs
質問者

お礼

把握。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAで書き換え可能な可変配列を使用したいです。

    Collectionクラスを使った可変型の配列は要素の中身を書き換えることができず、一旦removeして同じキー名でaddしなくてはなりません。 VBAでJavaでいうArrayListのような可変かつ書き換え可能な配列を使う方法はないものでしょうか? どなたか教えて下さい。

  • Doja 5.0 でGenericsは使えない?

    Doja 5.0ツールで、Genericsを用いたコードを含むiアプリ用のプロジェクトをビルドすると (総称型を使用可能にするには、-source 5 以降を使用してください) というエラーが出ます。 javacのオプションは -source 3 となっているようです。 これは変更できないものなのでしょうか? また,現在のDoCoMo携帯の実機に載っているJVMのバージョンはどう調べればよいでしょうか? 初歩的な質問ですがよろしくお願いします。

    • ベストアンサー
    • Java
  • DoJa開発

    Eclipse3.2.2の環境でiアプリの開発を行いたいと思っています。 現在DoJaの最新バージョン-5.0では、 3.2.xのサポートはしていないようで、 インストールしてもうまくいきませんでした。 Eclipseのバージョンを落として、3.1.xにしようと思ったのですが、 最新版しかダウンロードできません。 この状況でiアプリの開発を行うには、どうしたらいいのでしょうか?

  • 可変長配列の初期化

    いつもお世話になっております。 iOSで開発を勉強中の者です。 マップアプリを開発しており、NSMutableArrayからデータを呼び出して以下のようにCustomAnnotationクラスの初期化を行っていました。 CustomAnnotation *Pin1 = [[CustomAnnotation alloc] initWithLocationCoordinate:CLLocationCoordinate2DMake(numberToDouble(Latitude[1]), (numberToDouble(Longitude[1])) title:Title[1] subtitle:Subtitle[1]]; これを、for文を使って複数一度に初期化を行おうとしたのですが、エラーが出てしまいました。 コードは下のようになっています。 for(int i=0; i<10; i++) { CustomAnnotation *Pin[i] = [[CustomAnnotation alloc] initWithLocationCoordinate:CLLocationCoordinate2DMake(numberToDouble(Latitude[i]), (numberToDouble(Longitude[i]))) title:Title[i] subtitle:Subtitle[i]]; } Variable-sized object may not be initialized と出ているのですが、可変長配列の初期化はできないのでしょうか・・・。 またできるとしたらどのような方法があるのでしょうか。 どうかよろしくお願いします。

  • C++言語の配列の呼び方,動的・可変長の違い

    C++言語での配列の名称についての質問です. int Array[10]; みたいに宣言する普通の配列は「静的配列」と呼びますよね.コンパイル時に定数で要素数を指定しておかなければならないからですよね. これに対して,new[]演算子を用いて int *Array = new int[n]; といったように確保する配列はなんと呼ばれるのでしょうか. 実行後に変数を用いてその要素数を動的に指定できるので,「動的配列」と呼ぶ人が周りには多いです(「ポインタ配列」とも).しかし,C言語でのrealloc関数みたいに,直接に配列長を変化させるといったようなことはできませんよね. (改めてnew[]してmemcpy()すれば出来るのでしょうが) そこで,配列長をプログラム中で自在に変化させる方法としてstd::vectorを利用する方法がありますよね.このvectorを「動的配列」と呼ぶ人もいました. 私は,new[]したものは動的に要素数を指定できるがその後の配列長は固定であり,vectorはいつでも配列長が可変なので int Array[10]; ・・・静的固定長配列(静的配列) int n = 10; int *Array = new[n]; ・・・動的固定長配列 std::vector<int> v; ・・・可変長配列 と呼んでいるのですが,一般的にはそれぞれどのように呼ばれるのでしょうか. また,最近はstd::arrayをいうものを知りました.これについてもどのように呼ばれるのか,教えてください. よろしくお願いいたします.

  • c言語 可変長配列

    下は可変長配列のプログラムである.提供される可変長配列に文字列を格納するにはどのようにすればよいのでしょう.使い方の例を示していただけると助かります. #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /* 可変長配列の初期サイズ */ #define INIT_SIZE 5 typedef struct vector Vector; typedef Vector *VectorPtr; /* 可変長型配列の構造体 */ struct vector { char **elems; /* 要素(文字列)の配列(固定長)*/ int size; /* 可変長配列のサイズ */ int capacity; /* 可変長配列の最大容量 */ }; /* 可変長配列を生成する */ VectorPtr create_vector(void) { VectorPtr v = NULL; v = malloc(sizeof(Vector)); if (v == NULL) { fprintf(stderr, "Couldn't allocate memory for a vector\n"); exit(EXIT_FAILURE); } v->elems = malloc(sizeof(char *) * INIT_SIZE); v->size = 0; /* 初期使用サイズは 0 */ v->capacity = INIT_SIZE; return v; } /* 可変長配列の実質的な解放作業を行う. * (次々と free() するので free() 後の NULL 代入は省略) */ void delete_vector0(VectorPtr v) { int i; /* free() と同様,NULLポインタに対しては何も行わない */ if (v == NULL) { return; } /* 各要素(文字列)の領域を解放 */ for (i = 0; i < v->size; i++) { free(v->elems[i]); } free(v->elems); /* 内部配列の領域を解放 */ free(v); /* 外側の枠も解放 */ } /* 可変長配列 v を初期化する(未使用状態にするだけで領域は解放しない).*/ void clear_vector(VectorPtr v) { int i; assert(v); /* 要素の各文字列を解放 */ for (i = 0; i < v->size; i++) { free(v->elems[i]); v->elems[i] = NULL; } /* 使用サイズを0にする */ v->size = 0; } /* 可変長配列 v を拡大する */ void expand_vector(VectorPtr v) { assert(v); /* 最大容量を2倍に増やす */ v->capacity *= 2; /* 新しい最大容量を持つ領域を確保 */ v->elems = realloc(v->elems, sizeof(char *) * v->capacity); /* サイズを変更できなかった場合のエラー処理 */ if (v->elems == NULL) { fprintf(stderr, "Couldn't re-allocate memory for a vector\n"); exit(EXIT_FAILURE); } } /* 可変長配列 v の最後に文字列 s を追加 */ void append(VectorPtr v, char *s) { assert(s); /* 容量が一杯になったら容量を拡大する */ if (v->size == v->capacity) { expand_vector(v); } v->elems[v->size] = _strdup(s); /* 最後に要素を追加 */ v->size++; /* 使用部分のサイズを1つ増やす */ } /* 可変長配列の(使用部分の)サイズを返す.*/ int get_vector_size(VectorPtr v) { assert(v); return v->size; } /* 可変長配列 v における添え字 index の要素(文字列)を取得 */ char *get_elem(VectorPtr v, int index) { assert(v); /* 配列添え字の範囲をチェック */ if (index < 0 || index >= v->size) { fprintf(stderr, "Index out of bounds"); exit(EXIT_FAILURE); } /* 指定された添え字の値を返す */ return v->elems[index]; } /* 可変長配列の内容を横に並べて表示する.*/ void print_vector(VectorPtr v) { int i; assert(v); if (v->size == 0) { printf("(empty)\n"); return; } for (i = 0; i < v->size; i++) { printf(">>%s", v->elems[i]); } printf("\n"); } int main(void) { return 0; }

  • Struts:可変個数のテキストボックスの値を取得したい

    お世話になっております java 1.4.1 struts 1.1 Eclipse2.1.3 上にてwebアプリケーションの開発を行っております DynaActionFormを利用し、配列型のテキストボックスをsubmitする画面を作成しております。 String型の配列は取得できたのですが、 struts-config.xmlにて配列の要素数を指定しております。 テキストボックスの数は可変となる為、要素数を固定値で指定したくなく、 変わりにArrayListを使用出来ないかと考えております。 struts-config.xmlの対象のform-propetyエレメントのtype属性を"java.util.ArrayList" と変更してみたのですが、submitした時に アクションクラスのexecuteメソッドに来る前に 例外が発生しており、 「java.lang.IndexOutOfBoundsException: Index: 19, Size: 0」 といった例外がブラウザに表示されております。(文字制限の為、省略しております。) ArrayListを使用する場合でも要素数の定義などが必要ということなのでしょうか。 また、Stringの配列で要素数を指定しなくても取得する方法はございませんでしょうか。 当方、Strutsがまだ勉強し始めな状態のため、説明が至らない部分がございますことをご容赦ください。 ご教授の程、何卒よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Dojaのプロファイルの違いって何?

    i-appli開発ツールのDojaのバージョンの違いについて教えてください。 単純に、 1.0 -> 503用 2.0 -> 504用 2.1 -> FOMA用 3.0 -> 505用 ということでしょうか? またその場合、3.0で503用のアプリは作れますか? (504、505の機能を使わない、503用のサイズに収める、などすれば、503、504、505で動作すると思ったのですが…) ご存知の方、アドバイスお願いします。

    • ベストアンサー
    • Java
  • ArrayListを使った多次元配列の作成について

    ArrayListで可変長配列を扱っているのですが、 2次元可変長配列を用いる必要が出てきたので、 下記のように変更したのですがうまくいきません。 何が悪いのか教えていただけませんでしょうか? ----------------------------------------- ArrayList cars=new ArrayList(); cars.add("フェラーリ"); cars.add("ポルシェ"); cars.add("メルセデスベンツ"); for(int i=0;i<cars.size();i++){  String str=(String)cars.get(i);  System.out.println(str);} ----------------------------------------- 上記から下記のように変更しました。 ----------------------------------------- ArrayList[] cars=new ArrayList[3]; cars[0].add("フェラーリ"); cars[0].add("ポルシェ"); cars[0].add("メルセデスベンツ"); for(int i=0;i<cars[0].size();i++){  String str=(String)cars[0].get(i);  System.out.println(str);} ----------------------------------------- エラーは「Exception in thread "main" java.lang.NullPointerException」です。 どうやら初期配列が10ではなく3となってしまっているようです。

    • ベストアンサー
    • Java
  • 可変長配列に格納されたオブジェクトの参照

    「name」、「sex」などのデータがあり、 そのデータをHumanオブジェクトとして、可変長配列(humanArray)に格納してあります。 humanArray.add( new Human( name, sex ) );  // このような感じでしょうか。 標準入力から「name」が入力されると、オブジェクトを参照し、 HumanArrayに格納されているHumanオブジェクトの「name」データを一つ一つ比較して、 一致したら配列の要素をすべて出力する。 というプログラムを作りたいのです。 問題としているのは、 一致するかの照合処理を別のクラスで行うので、 nameを処理を行うクラスに渡す必要がありますが、 可変長配列のi番地に入っているオブジェクトのnameを 得るための方法がわかりません。 Humanクラスに public static String throwName() { return name; } のようなクラスを作って、 処理を行うクラスで、 String name = humanArray.get(i).throwCode(); というような処理を行うイメージなのですが・・・。 どのようにすれば良いのかご教授ください。 どのように質問をすれば良いのかも良くわからないので情報が少ないやもしれません その時は遠慮なく「追加情報が欲しい。」と仰ってください。 例 -----配列の内容----- 阿部 男 -------------------- 馬場 女 -------------------- 千葉 女 -------------------- 標準入力:馬場(name) -------Humanクラスの内容-------- class Human { private String name; private String sex; public Human( String nm, String s ) { name = nm; sex = s; } public static void showArticle() { System.out.println(name); System.out.println(sex); } }

    • ベストアンサー
    • Java