• ベストアンサー

まずいClass定義への対応

public class DataClass { public String data0=""; public String data1=""; .............................. public String data99=""; } と定義されたDataClassのインスタンスに文字列データxyzn(nはメンバーの通し番号)を入れるときに DataClass dataclass=new DataClass(); dataclass.data0="xyz0"; dataclass.data0="xyz1"; .............................. dataclass.data0="xyz99"; のように100行書き下さないでfor文を使うなどして短い行で済ませる方法はないでしょうか? ただしまずいDataClassの定義は変えられません DataClassのメンバー変数をArrayListや配列にしていれば問題ないのですが上記のように書き下されているのです

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

  • ベストアンサー
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

Javaではリフレクションという仕組みを使って、フィールドやメソッド、クラスを動的に 名前をつけてアクセスすることができます。 Field field = 当該クラス.class.getField(フィールド名); でフィールドのインスタンスを取得し、 field.set(値をセットするクラスのインスタンス,値); で値を代入することができます。 サンプルソースで確認してみてください。dataclassに値が代入されると思います。 ---------- サンプルソース ---------- DataClass dataclass = new DataClass(); for(int i = 0; i < 5; i++){ String fieldName = "data" + i; String value = "xyz" + i; try { java.lang.reflect.Field target = DataClass.class.getField(fieldName); target.set(dataclass,value); } catch (Exception e) { } }

guuman
質問者

お礼

ありがとうございます リフレクションは便利そうですね

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

その他の回答 (1)

noname#49664
noname#49664
回答No.1

例えば、DataClassを継承したクラスを定義し、そこで配列を引数に持つコンストラクタを用意するのはどうでしょう? そうした形でサブクラスによる対応はできないのでしょうか?

guuman
質問者

お礼

ありがとうございます

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

関連するQ&A

  • class Odd{

    class Odd{ public static void main(String argv[]){ int num[] = {2,3,4,8,4,2,6,9,12,20}; <空欄(複数行)> } } 上記のプログラムのはしくれがあるのですが、以下の問題があります。 配列要素の最初から最後までを文字としてつなげた文字列(すなわち”234842691220”)を生成して文字列変数numtextにいれ、それを画面に表示するとき、<空欄(複数行)>にいれるべきプログラムを答えよ。 自分なりに題意を考えたのですが、100%理解できないままとりあえず自分なりに作ってみたのですが、以下のものは正しいのか教えてください。 あとできれば題意が組み取れてなかったら教えていただくとありがたいです。 <空欄(複数行)> String numtext="234842691220"; System.out.println(numtext);

    • ベストアンサー
    • Java
  • classの再定義エラーについて

    C++初心者で初歩的な質問ですがよろしくお願いします。 【内容】  <test.h>  class testを定義  <test2.h>  class testを継承したclass test2を定義  <test3.h>  class testを継承したclass test3を定義  <test4.h>  class test2とclass test3で作成したインスタンスをメンバに持つclass test4を定義 【問題】  test2.hとtest3.hではclass testを継承するために#include "test.h"をしています。そして、test4.hではclass test2とclass test3を使うため#include "test2.h"、#include "test3.h"をしているのでredefinition of 'class test'というエラーが発生します。  このようなエラーを発生させずに上記の内容のものを実現させることは出来るのでしょうか?  ちなみにOSはTurboLinux8でコンパイラはg++です。よろしくお願いします。

  • インスタンス参照でアクセスできない。代わりに型名?

    画面上に、 名前を入力するTextBoxがひとつと、 顧客情報を入力するDataGridViewがひとつあり、 そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。 この2つのコントロールから入力されたデータをDBに登録したり、 DBから読み込んだ値を表示しようとしています。 (ほかにもいろいろ処理するのですが。) データを一時的に保持しておくクラスを作ろうと考え、 わざわざインスタンスを作るまでもないと思ったので、 staic public なメンバを使用して、 以下のようなクラスを作ってみました。   class Data {    public class Customer    {     static public int no = 0;     static public string name = "";     static public string mailAddr = "";    }    static public string name = "";    static public Customer[] customers = new Customer[20];   } ところが、たとえば、   customers[0].no = 1; のようにしようとすると、   「インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。」 となります。 どういう意味でしょう? また、どうすれば static public の配列を持てるでしょうか? (そもそもこういうやりかたはしない?) よろしくお願いします。

  • DB接続 二次元配列 指定表示

    DB接続でデータを取得したいとおもっています 今DBで3×10のデータがはいっており、... DB接続でデータを取得したいとおもっています 今DBで3×10のデータがはいっており、取得、二次元配列に返してあげている状態です この例だと3列(TESTNO、KANA、NAME)だと取得できるのですが TESTNO,KANA の二列取得をしたときにエラーが発生してしまいます どのように改善すればエラーが発生せず、取得できるようになりますか? それともこのロジック自体がまずいのでしょうか? アドバイスお願いします ソース一部 public String[][] selectExec(String sql) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //KAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 while(aa.next()){ //Resultsetが最終行になるまで実行 TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } public String[][] hairetu(ArrayList T,ArrayList N ,ArrayList K){ String[][]all=new String[3][T.size()]; all[0] = (String[])T.toArray(new String[0]);//配列TSETNOに収納 all[1] = (String[])N.toArray(new String[0]);//配列NAMEに収納 all[2] = (String[])K.toArray(new String[0]);//配列KANAに収納 return all; よろしくお願いします

    • ベストアンサー
    • Java
  • あるclassのオブジェクトをVectorで作るには

    以下のプログラムのようにあるクラスを定義してそのクラスの オブジェクトを配列として作成する方法は知ってるんですが、 Vectorとして作成するにはどうしたらいいですか? public class Test {  public static void main(String[] args) {   Book book[] = Book[5];   book[0] = new Book("English");  } } class Book{  String name;  Book(String name){   this.name = name; } }

    • ベストアンサー
    • Java
  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java
  • ArrayListクラスを利用するプログラムについて質問があるのですが。

    「Genericsを用いたArrayListを使用しループ処理にはiteratorを使用する。 という指定の下、 ArrayListのインスタンスを生成し次の5つの文字列を追加した後、 for文を使ってリストの中身を全て順番に画面表示したいんです。 "AA" "BB" "CC" "DD" "EE" --------------------------- import java.util.ArrayList; class TestA{ public static void main(String args[]) { ArrayList<String> array = new ArrayList<String>(); array.add("AA"); array.add("BB"); array.add("CC"); array.add("DD"); array.add("EE"); } } --------------------------- ここからよく解らないので教えていただけませんでしょうか?

    • ベストアンサー
    • Java
  • 配列の定義について

    配列とは、同じ形式のデーターを連続した記憶領域で確保するためのものである。 配列を構成する個々の領域を要素と呼び、要素の位置を添え字で示す。 Javaでは配列の先頭の要素を(0)番目と呼ぶ。 今、hairetsuという名前で10個の整数からなる配列を定義したい。 この場合の配列は(0)番目から始まり、終端は(9)番目である。 これを定義するには (int[] hairetsu;) (hairetsu = new int[10];) のように2行で行う方法と、 (int[] hairetsu = (new int[10];) のように、一行で行う方法がある。 Javaでは定義済みの配列の要素数は、配列変数名.(length)で知ることができ、 終端は(length + 1)番目となる。 したがって(length + 1)番目以降を使おうとすると、 配列要素の範囲外で(例外)が発生する。 この文章の( )の中は間違っていますか?

    • ベストアンサー
    • Java
  • ソートについて

    以下のプログラムを実行すると整数のソート結果が "1","12","3"となってしまいます。 整数と文字列を分離させてそれぞれソートさせたいのですが 方法がわかりません。 import java.util.*; import java.io.*; class StrArray{ ArrayList list = new ArrayList(); //最下行に要素を追加 public void add(String data){ list.add(data); } //全ての要素を配列で所得 public String[] getAll(){ String[] all = new String[list.size()]; for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public static final int ASC_SORT = 0; public void sort(int mode){ ArrayList al = this.qsort(mode, list); al = list; } //クイックソート public ArrayList qsort(int mode, ArrayList data){ ArrayList result = new ArrayList(); if(data.size()<1){ return new ArrayList(); } String middle = (String)data.get(data.size()/2); ArrayList left = new ArrayList(); ArrayList right = new ArrayList(); for(int i=0; i<data.size(); i++){ if(i != data.size()/2){ if(mode == 0){ if(((String)data.get(i)).compareTo(middle)<=0){ left.add(data.get(i)); } else{ right.add(data.get(i)); } result.addAll(qsort(0, left)); result.add(middle); result.addAll(qsort(0, right)); return result; } return result; } } } } class Sample{ public static void main(String args[]){ StrArray alist = new StrArray(); alist.add("bbb"); alist.add("aaa"); alist.add("ddd"); alist.add("ccc"); alist.add("3"); alist.add("1"); alist.add("12"); alist.sort(0); String[] info = alist.getAll(); for(int i = 0; i < info.length; i++){ System.out.println(info[i]); } } }

  • ファイルから多次元配列への読み込み

    はじめまして。 ここ最近、業務の都合でjava(正確には主にJSP)を描いています。 プログラムの作成は、シェルスクリプトを少し書く程度でまったく無いに等しい状態のなか、悪戦苦闘しております。 今回は、表題にもありますとおり、カンマ区切りファイルから多次元(2次元)配列に値を入れた意のですが、なかなか上手くいかないので、皆様のお知恵を拝借できればと思い、質問いたしまた。 私が書いたコードは、 String tmp; FileReader fr = new FileReader(application.getRealPath("./a.list")); BufferedReader br = new BufferedReader(fr); //1.リストの行数を取る ArrayList list = new ArrayList(); while (br.ready()) { tmp = br.readLine(); list.add(tmp); } int i = list.size(); //2.リストから読み込んだ値を取り合えず配列に入れてみる。 String strHex [][] = new String [i][3]; String strs2 [] = new String [i]; for ( int jj = 0; jj < i; jj++){ strs2[jj] = (String)list.get(jj); StringTokenizer st2 = new StringTokenizer(strs2[jj],","); int xyz = 0; while (st2.hasMoreTokens()) { strHex [jj][xyz] = (String)st2.nextToken(); xyz++; } } とやってみたのですが、xyzが配列の範囲を超えてアクセスしているという配列使用時はお決まりといわれるエラーが出てしまいます。 xyzは0で初期化した上で、トークンの数だけしか処理を行わないはずなので、わけがわからず途方にくれています。 なお、リストファイルの形式は、4列で行数は不定です。 例) 1,2,3b,4c 5,6,7d,8d 11,12,13,14 ・ ・ 見ないな感じです。 以上、お分かりになる方がいらっしゃいましたら、ヒントだけでもよろしくお願いいたします。

このQ&Aのポイント
  • MacにEW-M5071FTをつなげて複数ページのPDFファイルを両面印刷する際に、必ず2ページ目(1枚目の裏)が白紙になってしまいます。この問題の解決方法を教えてください。
  • 両面印刷で2ページ目(1枚目の裏)が白紙になる問題を解決したいです。MacにEW-M5071FTをつなげて複数ページのPDFファイルを両面印刷すると、2ページ目が白紙になります。どうすれば解決できるでしょうか。
  • MacにEW-M5071FTを接続して複数ページのPDFファイルを両面印刷すると、必ず2ページ目(1枚目の裏)が白紙になってしまう問題が発生しています。この問題の解決方法を教えてください。
回答を見る

専門家に質問してみよう