質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

5回答

5961閲覧

フィールド変数を使用せずにクラス型配列の中身を表示

touch

総合スコア38

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2015/03/08 09:37

編集2015/03/08 12:55

/*

  • 引数、パラメータ、戻り値を使用して
  • SubTest19クラスでフィールド変数を使用しないよう、
  • 修正して下さい。
  • また、SubTest19クラスのput()で行っている出力はfor文を使用する事。

*/

class Test19 {

public static void main(String[] args) { SubTest19 st19 = new SubTest19(); st19.set(); st19.put(); }

}

class SubTest19 {

private Test19data t19d[] = null; protected void set(){ t19d = new Test19data[3]; t19d[0] = new Test19data(); t19d[1] = new Test19data(); t19d[2] = new Test19data(); t19d[0].px = "K-0963"; t19d[0].ct = 23; t19d[1].px = "T-523363"; t19d[1].ct = 517; t19d[2].px = "J-97553"; t19d[2].ct = 5; } protected void put(){ System.out.println(t19d[0].px); System.out.println(t19d[0].ct); System.out.println(t19d[1].px); System.out.println(t19d[1].ct); System.out.println(t19d[2].px); System.out.println(t19d[2].ct); }

}

class Test19data{
public String px;
public int ct;

public Test19data(){ px = ""; ct = 0; }

}

フィールド変数を使用しないというのは、いわゆるprivate Test19data t19d[] = null;や、public String px;、public int ct;というコードを使わずに、引数、パラメータ、戻り値を使用してということだと思います。

ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

自己解決

class Test19 {

public static void main(String[] args) { SubTest19 st19 = new SubTest19(); Test19data[] t19d = st19.set(); st19.put(t19d); }

}

class SubTest19 {

protected Test19data[] set(){ Test19data t19d[] = null; t19d = new Test19data[3]; t19d[0] = new Test19data("K-0963", 23); t19d[1] = new Test19data("T-523363", 517); t19d[2] = new Test19data("J-97553", 5); return t19d; } protected void put(Test19data[] t19d){ // for( int i = 0; i < t19d.length; i++ ){ System.out.println(t19d[i].px); System.out.println(t19d[i].ct); } }

}

class Test19data{

public String px; public int ct; public Test19data(String px, int ct){ this.px = px; this.ct = ct; }

}

投稿2015/03/08 14:54

touch

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「SubTest19クラスでフィールド変数を使用しない」ということなので,
SubTest19の中で使う変数が全部ローカル変数になるように改変すればいいわけです.
Test19dataにはそんな指定は無いですし,そもそもこの場合
Test19dataにはフィールド変数がなければ使い物になりません.
Test19dataのコンストラクタはargiusさんのがそのまま使えます.

学校の課題ということなので完全な答えは出さずに,ここでは手がかりを示すにとどめます.

最終的にSubTest19#putメソッドでTest19dataの中身を表示することになるので,
putメソッドの中でTest19data[]を取得する必要があるわけです.
一方で,現在setメソッドではフィールド変数を操作しています.
ここで行った結果を,ローカル変数のみを用いて他でも使える様にするためには・・・?

さあ,お考えください.

投稿2015/03/08 13:16

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

touch

2015/03/08 13:21

ご配慮ありがとうございます。 ヒントを参考にもう少し自分で考えてみます。
swordone

2015/03/08 13:31

ちょっと編集履歴から先ほど載せていたコードを見ていたのですが, あれが割と課題の要求に沿っていたコードだと思ったのですが(引数,パラメータ,戻り値を利用している) 何が疑問,もしくは不満だったのでしょうか?
touch

2015/03/08 13:38

課題の原型を載せないと、皆様にフィールド変数を使わないという課題の意図が伝わらないと思い、すっきりさせる意味でも消してしまいました。どちらも最初から載せておくべきでしたね。
swordone

2015/03/08 13:41

そういうことじゃなくて,質問の時点で載せていたコードで 課題が要求していた仕様はほぼ満たしていたと思うんです. 私は「フィールド変数を使わない」というのがあやふやで混乱していましたが. そういうことなら,なぜ質問したのか,何が疑問で質問したのかがわからないのです.
touch

2015/03/08 13:49

あともう少しという所まで来ているのかなと思っていたのですが、あのままだとTest19dataクラスのところでどうしてもフィールド変数を使わないと回答にたどりつかなくて、何か違ったアプローチはないかと質問させていただきました。
swordone

2015/03/08 14:13

なるほど.ですがあなたの出された課題が正しくここに表示されているのであれば, 「SubTest19でフィールド変数を使わない」としか書かれていません. おそらくこれは「SubTest19クラスがフィールド変数を持たない」ということでしょう. 先生が一般的なプログラムを意識しているのであれば,課題のコードのputメソッドで登場する"オブジェクト.変数名"を使わない,ということも入っていると思われます. 他のクラスでフィールド変数を持つことに関しては制限がない,と私は読み取りますね. 完全にフィールド変数を封じられたらTest19dataは本当に使い物にならなくなりますし.
touch

2015/03/08 14:47

よく問題を読めば、 Test19dataクラス内では変数に関して制限が無いですね。 なら最初の方針で合ってたということですね・・ すいません、お騒がせしました。これからは問題をよく読みます。
swordone

2015/03/08 14:50

ついでに,私の最初の回答に付いているベストアンサーを外していただけるとありがたいです. 質問に沿わない回答がベストアンサーになっているのは私としても本意ではないので.
guest

0

「フィールド変数」というのが何を指しているのかがよくわかりませんが,
確かにmainメソッドが無駄に冗長な気がします.
以下推測で回答するので間違っていたらご指摘願います.

SubTest19のメンバとしてTest19data[]を定義します.
SubTest19のコンストラクタでTest19data[]を初期化します.
そしてSubTest19でtoString()をオーバーライドします.

lang

1class SubTest19 { 2 3 private Test19data t19d[]; 4 5 public SubTest19(){ 6 7 //配列の初期化 8 t19d = new Test19data[3]; 9 10 //インスタンス生成および情報の受け渡し 11 t19d[0] = new Test19data("K-0963", 23); 12 13 t19d[1] = new Test19data("T-523363", 517); 14 15 t19d[2] = new Test19data("J-97553", 5); 16 17 } 18 19 public String toString(){ 20 21 String str = ""; 22 //出力 23 for( int i = 0; i < t19d.length; i++ ){ 24 str += t19d[i].toString(); //argiusさんのtoStringをそのまま使うとします. 25 if(i != t19d.length - 1) 26 str += \n; //データの最後でなければ改行を入れる 27 } 28 return str; 29 } 30 31}

こうするとmainメソッドにおいて,

lang

1class Test19 { 2 public static void main(String[] args){ 3 System.out.println(new SubTest19()); 4 } 5}

このように,フィールド変数を使わずに内容を出力できます.

あるいは,Test19dataにputメソッドを次のようにして,

lang

1public void put(){ 2 for( int i = 0; i < t19d.length; i++ ){ 3 System.out.println(t19d[i]); 4 } 5}

mainメソッドの中で

lang

1public static void main(String[] args){ 2 new SubTest19().put(); 3}

としても出力できると思います.

投稿2015/03/08 12:41

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

touch

2015/03/08 13:06

ご回答頂きありがとうございます。 確かにこれならフィールド変数を使わずに内容を出力できますね。 勉強になります。
swordone

2015/03/08 13:10

いや,質問の意味が分からない時点で回答したのでこうしましたが, そういう質問であればこの回答は不適ですね(SubTest19がフィールド変数を持っている)
guest

0

引数、パラメータ、戻り値を使用して、フィールド変数を使用せずに
Test19data型配列の中身をfor文で出力したいです。

「フィールド変数を使用せずに」の部分が意味不明ですが、(仰っている内容を直接解釈すると)それは実装不可能です。

というより、フィールド変数の役割/目的と、コンストラクタとの関係を勘違いされているように見えます。コンストラクタは、フィールド変数を初期化するために存在します。質問文にあるコードは、「オブジェクトnew時に与えられた値を受け取ったパラメータ変数pxctの中身を破棄し、""0を再代入しているだけ(そしてコンストラクタを抜けるときに全ての値が破棄される)」という、結果的に何もしていないコードになっています。

class Test19data{ public Test19data(String px, int ct){ px = ""; ct = 0; } }

投稿2015/03/08 12:30

編集2015/03/08 12:34
yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

touch

2015/03/08 13:00

ご回答頂きありがとうございます。 まだ初心者ゆえご指摘の箇所含め勉強中でした。 今後の参考にさせていただきます。
guest

0

Javaではこのような場合はtoStringメソッドをオーバーライドします。
後はTest19dataのオブジェクトをそのままprintすればOKです。

toStringはEclipseなどのIDEを使えば生成機能で作ることができます。

lang

1class Test19data{ 2 private String px; 3 private int ct; 4 //コンストラクタ 5 public Test19data(String px, int ct){ 6 this.px = px; 7 this.ct = ct; 8 } 9 10 @Override 11 public String toString() { 12 return "Test19data [px=" + px + ", ct=" + ct + "]"; 13 } 14 15} 16 17// System.out.println(t19d[i]); // => Test19data [px=, ct=0]

投稿2015/03/08 10:22

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

touch

2015/03/08 11:15

早速ご回答頂きありがとうございます。 toStringメソッドをオーバーライドする方法があったのですね。 ちなみにフィールド変数を使用せずにエラーなく表示させることは可能でしょうか?
argius

2015/03/08 12:34

フィールド変数を使わずにというのは、フィールド変数なしで、ということですか? だとしたら無理だと思います。 なぜフィールド変数を使わずに、なのかが良く分かりませんので、その辺をご説明いただけるともうすこし的確にお答えできるかもしれません。 もしかして、タプルの配列を実現したいということでしょうか?
touch

2015/03/08 12:47

言葉足らずで申し訳ないです。 private String px;やprivate int ct;といったフィールド変数を使わずにということでした。 これは学校の課題で、そのような指示をされています。これから編集で原型を載せます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問