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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

3回答

1129閲覧

配列の受け取り方とその考え方について

Taku0096

総合スコア0

Java

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/10/31 02:14

前提・実現したいこと

大学の講義で出されている問題(Java)についての質問になります。
内容としては、メインメソッドで用意されている2つの配列(コードの配列と品物の配列)から、
コードの配列とコマンドライン引数から入力された値が正しければ、そのコードを品物名を出す、
というプログラムになります。

縛りとしては、コマンドライン引数がコードの配列に合致するかどうかを1メソッド、
その結果を以て表示するメソッドを1メソッドでやる必要があります。

コードは下記に記載していますが、おおよそこのような流れを実現したいです。

1:コマンドライン引数を入力

2:検索メソッドで、コマンドライン引数とコードの配列を比較

3:引数と配列の中身が合致していたら、

4:表示メソッドにて、「コマンドライン引数(コード)の品物は"品物コード配列名"です」と表示させる

3':引数と配列の中身が合致しなければ、

4':「コマンドライン引数は登録されていません」と表示させる

発生している問題・エラーメッセージ

エラーの類は発生していないのですが、考え方の部分で行き詰っています。

現在私の考えは以下になります。

【考え】
コマンドライン引数をint型で受け取り、コードの配列と比較、
コードの配列とコマンドライン引数が合致したら、合致した値をメインへリターンしたのち、
表示メソッドへその値と品物配列を引数で渡して表示。

ですが、表示メソッドを作成する際、コードの配列の値と
品物の配列の値、どうやって結びつけるのか?という部分が全くピンと来ず、
こちらで質問した次第です。

該当のソースコード

class MainClass{

public static void main(String[] args) {

         ※ 商品コード配列
int[] arrayCode = {101,845,261,166,876,620,733,122};

         ※ 品物名配列
String[] arrayName = {"事務机型","応接机","会議用机","事務机",
"畳み机","鉄製机","机","学生デスク"};

subClass1 sub1 = new subClass1(); subClass2 sub2 = new subClass2(); int input = Integer.parseInt(args[0]); int result = sub1.search(input,arrayCode); System.out.println(result); sub2.view(result,arrayName); }

}

class subClass1{

int search(int array,int[] nameArray) { int resultNum = 0; for(int i = 0; i < nameArray.length; i++) { if(array == nameArray[i]) { resultNum = nameArray[i]; }else { resultNum = array; } } return resultNum; }

}

class subClass2{

void view(int result,String[] ItemArray) { }

}

試したこと

上記にも記載した通り、縛りが検索と表示を別メソッドにする、のみなので、
商品コード配列を文字列として、品物名配列と併せて二次元配列にして考えたりしましたが、
コードと商品名の両方を、値としてどうやって検索メソッドで抽出してやるかがピンと来ません。
ガッツリ回答を求めているというよりは、考え方・ヒントを頂ければと思います。
どうぞよろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

Version: 2021-09 (4.21.0)
JavaSE1.7

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

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

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

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

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

jimbe

2021/10/31 03:44

コードはマークアッブ記法を用いて囲ってください。 マークアッブ記法に付きましてはヘルブをご参照ください。
BeatStar

2021/10/31 03:44

コードは "<code>" または "<コード>"のボタンを押して出てくるヤツの中に書きましょう。 非常に読みづらいです。
jimbe

2021/10/31 03:54

コードと商品名は、ご提示の int/String 配列として使わなければならないのでしょうか。 それとも、その値さえ使っていれば、int/String 配列で無くても良いのでしょうか。
guest

回答3

0

色々と基本的なところで言いたいことはありますが、質問にまず答えるとすれば、
商品コード配列と品物名配列は中身の数と順番が一致しているということがポイントとなります。
本当はMapなどを使って表現することでスマートに書けますが、質問者さんがロジックを考えることが重要なため、割愛します。
商品コード配列と品物名配列の中身の数と順番が一致しているということは、コマンドライン引数と商品コード配列が合致したときの、商品コード配列のインデックス(配列の添字)がわかれば、
品物名配列から合致した品物名を取得することができますよね?
殆ど答えになっているかも知れませんが、上記のように考えれば答えを出せます。

ひとつ気になっていることを言うと、メソッドを2つ用意しろという縛りなのに、subClass1と2という謎のクラスをわざわざ作っているのは解せません。
クラスが何を表しているのかすら不明なクラスなため、作る意味が全くありません。
MainClass内にprivateメソッドを2つ用意するだけで事足りるかと思われます。

投稿2021/10/31 02:47

nicorinpana

総合スコア55

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

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

0

ガッツリ回答を求めているというよりは、考え方・ヒントを頂ければと思います

こういう場合は、『規則性』や関連性を見付けるといいですよ。

質問のコードでいう arrayCode や arrayName はどういう関係でしょうか。

おそらく、arrayCode[0] の商品コードは arrayName[0] のコードだと思います。
では arrayCode[1] は? そう、arrayName[1] ですね。
では arrayCode[2] は? そう、arrayName[2] ですね。

つまり、

arrayCode[0] -> arrayName[0] arrayCode[1] -> arrayName[1] arrayCode[2] -> arrayName[2] arrayCode[3] -> arrayName[3] ...

のように、arrayCode[n] が決まればおのずとarrayName[n] に定まりますね。
DBだと、関数従属っていうやつみたいな? (厳密には違うと思いますが)

で、関係性を見ると、

arrayCode[i] -> arrayName[i] のように、arrayCodeのインデックスがそのままarrayNameのインデックスになっています。

ということは、

1. arrayCodeからinputのデータがある場所(インデックス)を取得する 2. (1)を arrayName[n] のようにして名前の方の同じ場所を参照する

的なロジックになるかなと。

それと、他の方も仰っているように、「表示するメソッド」と「どこにあるか調べるメソッド」がそれぞれ別のクラスに属していますが、今回はひとつのクラスでもできるかと。
(ただし、課題で、『○○メソッドは■■クラスに属していること』とかみたいに定義されている場合は別)

それともう一つ。
ダメとは言いませんが、arrayCodeとか arrayNameとかみたいな名前は良くないかなと。
Javaを含めた最近の言語では、システムハンガリアン的な付け方はしないみたいです。

それとコードはコードでも『商品コード』なので productCode のような名前がいいんじゃないかなと。
(別に強要はしていませんし、質問にある名前でいいならそれでいいです。もちろん、課題の定義上で変数名が決められている場合はそれに従ってください)

プログラミングって、趣味&独学とかでないなら、基本的に複数人で開発します。
なので出来る限り可読性を上げたほうが無難ですよ。

投稿2021/10/31 03:43

BeatStar

総合スコア4962

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

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

0

コードを見て気になった点を羅列してみました。

  • 縛りを見る限り、各処理は別メソッドであれば良いのでクラスを分ける必要はないのではないか。
  • クラスを分ける必要がないならば、arrayCodearrayNameをメンバ変数にすることで、全てのメソッドから参照できるようになる
  • arrayCodeよりもcodeArrayのほうがわかりやすい
  • arrayNameよりもnameArrayのほうがわかりやすい
  • クラス名は大文字始まりのキャメルケース
  • subClass1::searchの引数名がnameArrayであるが、期待されているのはarrayCodeなので混乱する
  • arrayNameは単純な文字列の配列なので、インデックスを使用しないと特定できない
    そのため、resultNum = nameArray[i]この処理はむしろ書いてはいけない
    ユーザーの入力がarrayCodeにない場合はエラーを出力して終了するなどを考えるべき
  • subClass1::seachメソッドの返り値がarrayCodeのインデックスであるということになれば、
    その返り値を使ってarrayNameから品物を取得することができるはず

また、各メソッドにコメントつけといたほうが頭の中整理されると思います。

java

1/** 2 * コード配列からユーザー入力されたコードのインデックスを検索するメソッド 3 * @param array ユーザー入力されたコード 4 * @param nameArray コード配列 5 * @return コード配列のインデックス 6 */ 7int search(int array,int[] nameArray) { 8 9 int resultNum = 0; 10 11 for (int i = 0; i < nameArray.length; i++) { 12 if (array == nameArray[i]) { 13 resultNum = nameArray[i]; 14 } else { 15 resultNum = array; 16 } 17 } 18 19 return resultNum; 20}

投稿2021/10/31 03:01

KAOsaka

総合スコア531

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問