- ベストアンサー
可変長配列に格納されたオブジェクトの参照
「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); } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JAVAの勉強をされているものとお見受けしたので、 直接回答するよりも、ご自分で調べた方がよくわかると思いますので お節介とは思いましたが、あえてアドバイスとさせてください。 次のヒントを調べてみてください。それによって答えがわかることと思います。 回答を直接得たかった場合は、すみません。 (1)「static」というキーワードはどんな意味をもっているでしょうか。 クラスメソッドとインスタンスメソッドの違いについて調べてみてください。 (2)JAVA言語そのものには、可変長配列はなく、Java 2 SDKには、標準で 可変長配列のように使えるクラスがあります。お使いになっているのは 恐らくこれです。 既にget()メソッドはご存知なので、あとはこのクラスに入っている 要素の個数を得るためのメソッドがわかれば、for文で順に値を 取り出し、ひとつひとつname属性を比較することができます。 SDKに付属のクラスにどのようなメソッドがあるか等の説明は、 SDKのAPIドキュメントに書かれています。 ・(1)(2)がわかれば、とりあえず答えを得ることができます。 以降は応用になります。 (3)(2)で述べた可変長配列に相当するクラスには、iterator()という メソッドがあります。このメソッドは「このオブジェクトが保有する 各要素を順に返すjava.util.Iteratorオブジェクト」を返します。 これを使うことで、繰り返し処理をより汎用的に書くことができます。 (ただし速度は若干低下します。) 使い方を調べてみてはいかがですか。 (4)いわゆる「配列」は、要素を順に処理するのには適していますが、 データベースのように、キーに対応する値を取得するのには効率が 悪い面があります。このような用途のために、Javaにはjava.util.Map インタフェースおよびそのサブクラス(例:java.util.HashMap)が 用意されています。 (1)~(3)までで作成した処理を、Mapを使って書き換えることで メリットがわかります。
その他の回答 (2)
- covachan
- ベストアンサー率38% (46/120)
こんにちは >Humanクラスに >public static String throwName() >{ > return name; >} Humanクラスは値を保持するビーンクラスですよね? であるならば複数のHumanオブジェクトが生成されるのに その中の値へのアクセスメソッドがstaticなのは問題ではないですか? ここは#2さんが仰るようにstaticを外すべきです。 それと、メソッド名もgetNameのように書くと慣例に沿っていてベターだと思います。 きっと既にコーディングをされて動作が期待通りでない上での質問だと思われますが、 staticの意味、目的なりを把握されればきっと問題点が見えてくると思います。
お礼
ご回答ありがとうございます。 throwNameメソッドにstaticを付けていた事については、 今まではstaticを付けてメソッドを道具として利用するのみだったので、 そのまま付けてしまいました。 また、メソッド名に関しても、 フィールドを返すメソッドは「get+フィールド」 と命名する事を知りましたので、 HumanクラスのthrowNameメソッドは public String getName(){ return name; } と修正しました。 また、Humanクラスに public String getHumanObj(){ String human = "" + name + " " + sex; return human; } というメソッドを追加しました。 データを得る際の実際のコードは String name = "馬場"; for( int i=0; i<humanArray.size(); i++){ Human human = new humanArray.get(i); nm = human.getName(); if( name.equals( nm ) ){ humanObj = human.getHumanObj(); System.out.println( humanObj ); } } とする事で、humanArrayの1番地に入っているオブジェクトの要素である 「馬場 女」を出力する事ができました。 (完成したコードを見ずに、改めて書いているのでコードを間違えているかもしれませんが。) ご回答くださった皆様に改めてお礼申し上げます。 ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>Humanクラスに >public static String throwName(){ >return name; >} >のようなクラスを作って、 Human クラスのインスタンスから名前を得るためのメソッドを追加するということで考え方はいいと思いますが、 static を付けないで public String throwName(){ return name; } のようにすればいいかと思います。
お礼
ご回答ありがとうございます。 staticに関しては、オブジェクトに関連しない。 という意味は知っていたのですが、 今まではstaticを付けてメソッドを道具として利用する場合が多かったので、 そのまま付けてしまいました。 問題に関しては解決できました。 実際のコードに関しては上で回答してくださった方の 解答欄に書かせていただきます。 ご了承ください。
お礼
ご回答ありがとうございます。 まず始めにお詫びを。 普段から可変長配列を利用する時はArrayListを利用していたので、 可変長配列=ArrayListという先入観を持って話をしてしまいました。 そして、問題に関しては 可変長配列に入っている、利用したいオブジェクトを Humanクラス型にキャストしてインスタンスを作り出し、 そのインスタンス変数を使ってHumanクラスのメソッドを呼び出す事で解決する事ができました。 実際のコードに関しては上で回答してくださった方の お礼欄に書かせていただきます。 ご了承ください。