• ベストアンサー

可変長配列に格納されたオブジェクトの参照

proustの回答

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.1

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を使って書き換えることで  メリットがわかります。

noname#17462
質問者

お礼

ご回答ありがとうございます。 まず始めにお詫びを。 普段から可変長配列を利用する時はArrayListを利用していたので、 可変長配列=ArrayListという先入観を持って話をしてしまいました。 そして、問題に関しては 可変長配列に入っている、利用したいオブジェクトを Humanクラス型にキャストしてインスタンスを作り出し、 そのインスタンス変数を使ってHumanクラスのメソッドを呼び出す事で解決する事ができました。 実際のコードに関しては上で回答してくださった方の お礼欄に書かせていただきます。 ご了承ください。

関連するQ&A

  • オブジェクトのフィールドのコピーについて

    下記で作成したプログラムで、Humanクラスの別のオブジェクトの各フィールドの内容を自身のオブジェクトの各フィールドにコピーするpublicメソッドのcopyDataで、「Humanクラスの別のオブジェクトの各フィールドの内容を自身のオブジェクトの各フィールドにコピーする」するプログラムが分かりません。むしろ、知らなくて、もしよければどのようなプログラムになるのか教えてください。 class Human { private double height, weight; private String name; public Human() { height = 0; weight = 0; name = "noname"; } public void inputData(String na, double ht, double wt) { name = na; height = ht; weight = wt; } public void showValue() { System.out.println("名前: " + name + ", 身長: " + height + "cm, 体重:"+ weight + "kg"); } public void copyData(Human a) { } } class KNO1 { public static void main(String args[]) { Human member1,member2,member3; System.out.println("member1:"); member1 = new Human(); member1.inputData("Taro",165.0,55.0); menber1.showValue(); System.out.println("member2:"); menber2 = new Human(); member2 = member1; member2.showValue(); System.out.println("member3:"); member3 = new Human(); member3.copyData(menber1); member3.showValue(); member1.inputData("Hana",175.0,75.0); System.out.println("member1:"); member1.showValue(); System.out.println("member2:"); member2.showValue(); System.out.println("member3:"); member3.showValue(); } }

    • ベストアンサー
    • Java
  • C#で構造体配列

    C#で構造体配列の操作練習?をしているのですが using System; using System.Collections.Generic; using System.Text; namespace test1 { public struct Data { public string name; // 名前 public uint value; // 値 } class read { Data[] human = new Data[300]; public static string idSearch() { for (int i = 0; i < 300; i++) { if (test1.read.human[i].value == 25) return test1.read.human[i].name; } } } } だと エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。 と言うエラーが出るのですが、どうしてでしょうか?

  • ある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
  • 連想配列、オブジェクト配列の使い分け

    お世話になります。 データベースで結果を取得する場合など、連想配列のままではなく何故、わざわざオブジェクトに格納する様な手法が使われるのでしょうか? 連想配列のままで処理するほうが早いと思いますし、それに付随するクラスファイルも多くなります。また、「結びつきを緩くして仕様変更に耐えうる様に」など聞きますが、余計複雑になってしまう様な気がしますので、メリットが今ひとつ分からず判断に迷ってしまいます。 どの様な使い分け、考え方をすれば良いかアドバイスいただけたら幸いです。 何卒、宜しくお願いします。 例) ※必要と思われる部分のみ記述しております。 ■連想配列 while($row=mysql_fetch_assoc($res)){ ~以下必要な処理} ■オブジェクト配列 while($row=mysql_fetch_assoc($res)){ $example = new Example(); $example->setName($row['name']); $example->setAddr($row['addr']); $array[] = $example } ~以下必要な処理 ○モデル class Example { private $_name = null; private $_addr = null; public function __construct() {} public function setName($name) { $this->_name = (string) $name; return $this; } public function getName() { return $this->_name; } public function setAddr($addr) { $this->_addr = (string) $addr; } ~以下省略 }

    • ベストアンサー
    • PHP
  • jdk1.5.0_11を使って

    参考書の通りにサクラエディタにフィールドのみのHumanクラス public class Human{ String name; } を作り、 もう一つ、 public class UseHuman{ public static void main(String args[ ]){ Human.taro = new Human(); taro.name = "太郎"; System.out.println("taro.name);} } として、コンパイルして実行すると、taro.nameと出てしまい、設定したはずの"太郎"という文字が出てきません... XPを使ってコンパイル実行するとちゃんと太郎と出てくるのですが、今使っているパソコンがVistaなのが原因なのでしょうか? それとも、設定が間違っていたり、ダウンロードしなければならないものをしていないとかでしょうか?

    • ベストアンサー
    • Java
  • オブジェクトを配列として扱いたい

    Java(オブジェクト指向)を始めて数日の者です。 LinkedListを利用し、インスタンス化したオブジェクトをListに入れて 扱えるようにしたいと考えています。 具体的には LinkedList<クラス名> array = new LinkedList<クラス名>(); クラス名 object1 = new クラス名(); -object1の処理- array.add(object1); -object1の処理- array.add(object1); -object1の処理- array.add(object1); このようにして、object1を配列で管理するイメージです。 object1の処理結果は、毎度変わっています。 しかしこれですと、最後のobject1の処理の内容がすべてのarray(i)に入ってしまいます。 要は、array(i)は全て、同じobject1を参照しているだけ。 object1の変更結果がarray(i)に入っていくというイメージでは無い、ということでしょうか? また、この他でインスタンス化したものを配列で管理できるような方法がございましたら、ご教授いただけると幸いです。m(_ _)m 動的に配列の要素数を変更(要素が追加)ができるようにしたいのです。

    • ベストアンサー
    • Java
  • オブジェクトの参照渡しについて

    メソッドの引数にオブジェクトを指定した場合、 それは「参照渡し」だと理解していました。 でも以下のプログラムでは、指定したオブジェクトに変化がありません。 public static void main(String[] args) { BigDecimal b = new BigDecimal(1); System.out.println(b); test(b); System.out.println(b); } public static void test(BigDecimal b) { b = new BigDecimal(2); } 出力は以下です。 ------------------------- 1 1 ------------------------- どういうことでしょうか? 正しい知識をお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 参照型の2次元配列の作り方

    参照型の2次元配列の作り方 実行結果は、 赤レッド 黄イエロー 青ブルー と画面表示されるようにしたいのです。 class Sample{ public static void main(String[]args){ String[][] str ={{      ?     }}; System.out.println(     ?     ); } } ?のところをどう書いたらよいか御指導御願い致します。

    • ベストアンサー
    • Java
  • 抽象クラスとオブジェクトを格納する配列(java)

    独習java第4版でわからない所があります。 abstract class Widget { String color; abstract int getMass(); public String toString() { return getClass().getName() + ": " + color + ", " + getMass(); } } class WidgetA extends Widget { final static int MASS = 4; WidgetA(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetB extends Widget { final static int MASS = 1; WidgetB(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetC extends Widget { final static int MASS = 5; WidgetC(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetD extends Widget { final static int MASS = 17; WidgetD(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetTypes { static int NUMWIDGETS = 6; public static void main(String args[]) { // 部品を格納する領域を宣言して割り当てる Widget widgets[] = new Widget[NUMWIDGETS]; // 部品を作成する widgets[0] = new WidgetC("Red"); widgets[1] = new WidgetA("Green"); widgets[2] = new WidgetD("Yellow"); widgets[3] = new WidgetB("Magenta"); widgets[4] = new WidgetA("Black"); widgets[5] = new WidgetC("White"); // 部品を処理する int totalMass = 0; for(int i = 0; i < NUMWIDGETS; i++) { Widget w = widgets[i]; System.out.println(w); totalMass += w.getMass(); } // 総重量を表示する System.out.println("Total mass = " + totalMass); } } これはある問題の解答ですが、僕にはどうしても理解出来ない部分があります。 mainのforループ内で Widget w = widgets[i]; totalMass += w.getMass(); となっています。 この仕組がわかりません。 まず Widget w = widgets[i] でWidget型の変数wにWidget型のwidget[i]を代入しているのにw.getMass()がエラーにならない理由がわかりません。(Widgetクラスは抽象クラスなのにwがWidgetクラスのインスタンスになっている?) これは 抽象メソッド( abstract int getMass() ) があるためでしょうか? ちなみにWidgetクラスとそのサブクラスからこの抽象メソッドを削除したらコンパイルエラーが出ました。 ではなぜ抽象クラスの抽象メソッドから、そのサブクラスのメソッドまで範囲が伸びるのでしょうか? どういう仕組でしょうか? この質問を書きながら思ったのですが、どうも配列の仕組みや抽象クラス・メソッドの仕組み、「オブジェクト」と「インスタンス」の違いがよくわかってないようです。 多分問題の本質はそこにあると思うんです。 駄文で申し訳ないです。 よろしくお願いします。

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

    画面上に、 名前を入力する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 の配列を持てるでしょうか? (そもそもこういうやりかたはしない?) よろしくお願いします。