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

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

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

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

Q&A

解決済

4回答

3513閲覧

引数のString型からString[]型に格納

tanaka002

総合スコア22

Java

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

0グッド

0クリップ

投稿2019/08/28 07:17

編集2019/08/28 07:41

java

1public class DraemonPoket { 2 //配列型のフィールドを作成 3 private String[] itemList; 4 5 //長さをのフィールド 6 private int index; 7 8 //コンストラクターで引数を受け取る。 9 public DraemonPoket(int length){ 10 11 this.index =length; 12 System.out.println(this.index); 13 } 14 //道具のメソッドで引数を受け取る。 15 public void setItem(String args){ 16 17 System.out.println(args); 18 19 this.itemList = new String[this.index]; 20 21 this.itemList[0] =args; 22 23 } 24 25 //アイテムを表示をするメソッド 26 public void showItem(){ 27 28 for(String result : this.itemList){ 29 System.out.println(result); 30 } 31 }

java

1public class Main14 { 2 3 public static void main(String [] args){ 4 5 //インスタンスを作成してコマンドライン引数の長さを渡す。 6 DraemonPoket item = new DraemonPoket(args.length); 7 8 item.setItem(args[0]); 9 item.setItem(args[1]); 10 item.setItem(args[2]); 11 item.setItem(args[3]); 12 13 item.showItem(); 14 15 } 16}

コマンドライン引数で4つ道具をargsに渡しています。
その道具をフィールドのprivate String[] itemListに一つずつ格納をしてshowItemで表示をたいです。

いろいろ試して自分で解決できないので質問をさせていただきました。
すみません。
よろしくお願いします。

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

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

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

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

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

azuapricot

2019/08/28 07:24

ListなのかArrayなのかわかんなくなるんで配列にListって使わないほうがいいよーな
y_waiwai

2019/08/28 07:24

その4つをどうargsに格納してますか? 実際のargsの内容を提示してください
azuapricot

2019/08/28 07:25

String[] でやる必要があるのかも疑問でList<String>じゃだめなんですかね?(私が配列嫌いなだけ)
tanaka002

2019/08/28 07:26

args の中身は 1タケコプター 2翻訳こんにゃく 3スモールライト 4タイムふろしき になります。
tanaka002

2019/08/28 07:27

自分での理解の為にString[]でやっています。。。
azuapricot

2019/08/28 07:30

this.itemList[0] =args; これいつまでたっても道具1個しか入らないよーにみえるんですけど・・・ 今何に詰まっているのか詳細にかきましょう
y_waiwai

2019/08/28 07:32

その4つをArgsにどう格納してるんでしょうか?
tanaka002

2019/08/28 07:33

item.setItem(args[0]); item.setItem(args[1]); item.setItem(args[2]); item.setItem(args[3]); mainの方からメソッドで引数として渡してます。
azuapricot

2019/08/28 07:34

mainも書いて回答者が再現しやすくすると良いですね
y_waiwai

2019/08/28 07:34

なんかはなしが違ってますが。。
tetutetu

2019/08/28 07:42 編集

コンストラクタか。よく読んでませんでした。消します。
guest

回答4

0

java

1 //道具のメソッドで引数を受け取る。 2 public void setItem(String args){ 3 4 System.out.println(args); 5 6 this.itemList = new String[this.index]; 7 8 this.itemList[0] =args; 9 10 }

このメソッドを何度起動しても、配列を生成してその0番目に引数要素を格納する、ということを繰り返すのみで、配列再生成の時点で前に入れた情報が消滅します。
新たにアイテムを入れるときのために、「次はどこに入れればいいか」の情報を持っておく必要があります。

投稿2019/08/28 08:08

swordone

総合スコア20651

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

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

0

原因は全てsetItemメソッドにあります

まず、質問者様のコードですと
this.itemList[0] =args;で
常に配列の0番目に引数であるargsを入れ続けます
恐らくitem.showItem()の出力結果が

・args[3]の中身
・null
・null
・null

になっているのではないでしょうか。
それを修正するために、まずはsetItemメソッドの引数に配列のインデックスを追加します。

java

1item.setItem(args[0],0); 2item.setItem(args[1],1); 3... 4//省略

java

1public void setItem(String args, int hoge){ 2 //省略 3 this.itemList[hoge] =args; 4}

(正直for文でやった方が絶対良いのですが、まだ学ばれていないのでしょうか。)

ここまでで実行した場合
・null
・null
・null
・args[3]の中身
という出力になると思います。

原因はこれまたsetItemメソッド内で

java

1this.itemList = new String[this.index];

と、毎回配列を初期化しているためです。

正常に出力する方法としては
・setItemメソッドにargsを配列として渡す
(この場合、前述の配列のインデックスを引数に追加する必要はないです)
・DraemonPoketで配列を初期化し、setItemメソッドでは初期化を行わない

のどちらかになります。

こんなですかね

Main

java

1public class Main { 2 3 public static void main(String[] args) { 4 DraemonPoket item = new DraemonPoket(args.length); 5 6 for(int i=0;i<args.length;i++) { 7 item.setItem(args[i],i); 8 } 9 10 item.showItem(); 11 }

DraemonPoket

java

1public class DraemonPoket { 2 3 private String[] itemList; 4 5 public DraemonPoket(int length){ 6 this.itemList = new String[length]; 7 } 8 9 public void setItem(String args, int num){ 10 this.itemList[num] =args; 11 } 12 13 public void showItem(){ 14 for(String result : this.itemList){ 15 System.out.println(result); 16 } 17 } 18}

投稿2019/08/28 08:10

編集2019/08/28 08:44
tetutetu

総合スコア419

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

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

azuapricot

2019/08/28 08:19

setItem()の引数にインデックス渡す必要ありますかね・・・(まぁかんたんですけど)
tetutetu

2019/08/28 08:27

ローカル環境ではfor文で書いたので forで回すなら中身が item.setItem(args[i],i); だけで済むので楽かなと思った次第です。 DraemonPoketクラス側で変数を増やすか引数を増やすか程度の違いかなと…
tetutetu

2019/08/28 08:45

とりあえず今一番気になってるのは処理の中身より「DraemonPoket」のスペルなんですが… 蛇足か。
guest

0

ベストアンサー

参考程度にどうぞ

Main
※めんどくさいのでコマンドラインからじゃなくて直接渡してます

Java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 //インスタンスを作成してコマンドライン引数の長さを渡す。 4 DraemonPoket item = new DraemonPoket(4); 5 6 item.setItem("あんきぱん"); 7 item.setItem("たけこぷたー"); 8 item.setItem("どこでもどあ"); 9 item.setItem("とうめいまんと"); 10 11 item.showItem(); 12 } 13}

どらえもん

Java

1public class DraemonPoket { 2 private String[] itemList; 3 4 private int index; 5 6 // 配列格納用のカウント 0スタート 7 private static int count = 0; 8 9 public DraemonPoket(int length){ 10 // コンストラクタで配列のサイズを決定 11 this.itemList = new String[length]; 12 this.index =length; 13 } 14 15 public void setItem(String args){ 16 17 // index = countにつめる 18 this.itemList[this.count] =args; 19 20 // count のかうんとあっぷ 21 this.count++; 22 } 23 24 public void showItem(){ 25 26 for(String result : this.itemList){ 27 System.out.println(result); 28 } 29 } 30}

出力結果

あんきぱん たけこぷたー どこでもどあ とうめいまんと

投稿2019/08/28 08:06

azuapricot

総合スコア2341

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

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

azuapricot

2019/08/28 08:07

(もっとかっこいいやりかたありそう)
tetutetu

2019/08/28 08:48 編集

>インスタンスを作成してコマンドライン引数の長さを渡す。 DraemonPoket item = new DraemonPoket(args.length); の方がコメントには合ってる気がします。 追:いや面倒で直接渡してるからか。失礼しました。 >this.itemList = new String[length]; で書くなら変数index自体が不要な気もしますね… 他でindex使ってるわけでもないですし
tanaka002

2019/08/29 00:24

皆様ありがとうございます! フィールドに渡ってきた引数を代入していたことが間違いでした。
tetutetu

2019/08/29 00:48

>フィールドに渡ってきた引数を代入していたことが間違いでした。 配列をnewする場所が問題 と認識していただければと思います。 私の回答の方で、配列を引数としてsetItemに渡すのであればここでnewしても問題ないとは記載しましたが、わざわざコンストラクタで受け取った数値をindexに代入するのであれば そこでindexの長さ分の配列を定義 (this.itemList = new String[index];) してしまった方が、処理の流れを読むのも簡単になるかと。
退会済みユーザー

退会済みユーザー

2019/08/29 07:32

マイナスつけたくなるstaticの扱い
guest

0

Javaのプログラムは、下のプログラムのようにクラスを定義して、main関数の中で実行するコードを書きます。
このようなプログラムを、HelloWorld.javaというファイル(クラス名と一致する名前のファイル)に書き込んでおいて、javacコマンドでコンパイルし、javaコマンドで実行します。

public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!!"); } }

ところが、質問に書かれているプログラムには、クラスの定義も、main関数もありません。

Javaのプログラミングの初歩のところで躓いているように思われますので、「はじめてのJava」的なタイトルのMookを2,3冊買って、Javaの勉強をしてみては如何でしょうか?

まずは、コンパイルできるようなJavaのコードを書けるようになりましょう!

投稿2019/08/28 07:37

coco_bauer

総合スコア6915

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

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

azuapricot

2019/08/28 07:45

書いてるけど省いてるってコードよく見ればわかるんで回答としては間違ってるかなーってことで低評価押しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問