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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

2回答

1153閲覧

呼び元に複数の文字列を返したい

ogenko

総合スコア0

Java

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

1クリップ

投稿2021/08/29 00:37

編集2021/08/29 01:33

*本質問は急ぎのため
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12248474427
にもポストしております。

前提・実現したいこと

使用言語:java

文字列を呼び元A.javaに返すクラスB.javaを作りたい。

B.javaではgetFruit、getColorにて

String fruit="ばなな,りんご,みかん";//フルーツの名前(*1)
String color="yellow","red","orange"//フルーツの色(*2)
のような文字列を取得します。
String fruit="パイン";//フルーツの名前
String color="yellow"//フルーツの色
の場合もあります。

そこでわからないのが
A.javaに

"ばなな"
"yellow"

"りんご"
"red"

"みかん"
"orange"

のように、1と2からフルーツ毎の文字列にわけてA.javaに
まとめて返すのと、フルーツの情報が取れたことを示すリターンコードを返したいのです。
A.javaから呼ばれて、どのように返してあげればよいのか
わからなくて困っています。

Java初心者のため、いろいろな返し方(配列、オブジェクトetc)
いろいろあるようですが、わかっておらず
どなかたヒントでも構いませんのでご教授いただけませんでしょうか。。

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

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

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

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

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

dodox86

2021/08/29 02:50

知恵袋の方で既に大量のレスをいただいているようです。
BeatStar

2021/08/29 12:46

> 本質問は急ぎのため その割には自分は返信すらしないのな。 つまり、これは釣りか。 ここは釣りをするところではありません。
guest

回答2

0

いろんなやり方がありますが、それぞれどんな時に使うのかを書いてみます。

なお、以下のコード例は、特に断り書きがなければ A クラスのメソッドに書く感じで、b という変数は B クラスのオブジェクトとします。

1) 別々のメソッドで返す

getFruit と getColor の 2 つのメソッドに分ける方法ですが、フルーツの名前と色を関連づけて返したいなら、関連づけるための手段 (主に引数) が必要になります。

1-a) フルーツの順番が決まっていて、その何番目という方法で指定したいなら、両方に引数 int index を持たせます。

java

1int index = ... 2String fruit = b.getFruit(index); // index番目のフルーツの名前を返す 3String color = b.getColor(index); // index番目のフルーツの色を返す

1-b) フルーツの名前が分かれば色が決まるなら、まず getFruit を呼び、その戻り値を使って getColor を呼ぶことになるでしょう。(なお、両方とも引数なしにしてそれぞれランダムな値を返すと、fruit と color の値には何の関係もなくなってしまいます。)

java

1String fruit = b.getFruit(); // 引数なし (ランダムに返す、など) 2String color = b.getColor(fruit); // 引数 (String fruit) に対応する色を返す

1-c) b オブジェクトが「現在のフルーツはこれ」という状態を持ち、getFruit や getColor は現在のフルーツに関する情報を返す、ということも考えられます。この場合、b は状態を更新するメソッドを持ってたり、何かの条件によって自動的に状態が更新されたりするでしょう。

java

1String fruit1 = b.getFruit(); // 現在のフルーツの名前を返す 2String color1 = b.getColor(); // 現在のフルーツの色を返す 3 4b.updateCurrentFruit(); // 現在のフルーツを更新する 5String fruit2 = b.getFruit(); // 更新されたフルーツの名前を返す 6String color2 = b.getColor(); // 更新されたフルーツの色を返す

2) 配列で返す

フルーツの名前と色がどちらも文字列なので、文字列の配列で返すこともできます。

ただし、戻り値が長さ 2 の配列で、最初の要素はフルーツの名前、次の要素はフルーツの色ということが、ソースコードからは読み取りにくく、名前と色を取り違えたりするバグの元になります。
また、型が違うものを返す場合は Object の配列で返して、それぞれの値をキャストすることになるため、さらに分かりにくくなります。

なお、2) 以降ではメソッドの引数は省略しますが、必要に応じて int index などの引数を持たせてください。(ランダムに返す場合などは引数は不要ですが。)

java

1String[] result = b.getFruitAndColor(); // フルーツの名前と色を配列で返す 2String fruit = result[0]; // 最初の要素はフルーツの名前 3String color = result[1]; // 次の要素はフルーツの色

3) Pair (あれば) で返す

配列で返す場合の問題点を解決するために、他の多くの言語には「タプル」という型があります。
これは、わざわざクラスを作るまでもない、値の一時的な組み合わせを表すために使われます。

残念ながら Java の標準ライブラリにはありませんが、多くのライブラリが Pair などのクラスを用意していますし、自分で作ることもできます。
参考: JavaでTupleが欲しくなったときメモ - Qiita
参考: java - Can not resolve import javafx.util.Pair in android studio - Stack Overflow ← 自分で作るなら、この回答が一番シンプル。

ここでは JavaFX の javafx.util.Pair を使ってみましょう。まず、B クラスの実装ですが、Pair<String, String> は 2 つの値 (どちらも String 型) を持つペアを表すオブジェクトです。

java

1import javafx.util.Pair; 2 3public class B { 4 // いろいろ省略 5 6 public Pair<String, String> getFruitAndColor() { 7 String fruit = "ばなな"; 8 String color = "yellow"; 9 return new Pair<String, String>(fruit, color); 10 } 11}

使う側はこんな感じになります。key と value のどっちが名前でどっちが色かを確認する必要はありますが、配列と違って要素数を気にする必要はありませんし、key と value の型が違っても大丈夫です。

java

1Pair<String, String> pair = b.getFruitAndColor(); // フルーツの名前と色を Pair で返す 2String fruit = pair.getKey(); // key はフルーツの名前 3String color = pair.getValue(); // value はフルーツの色

4) クラスを作る

フルーツの名前と色の組み合わせに大きな意味があったり、その組み合わせをいろんなところで使うなら、クラスを作ることを考えましょう。

ここで大事なのが、適切な名前をつけることです。例えば、それが「フルーツである (その要素として名前や色がある)」ことが大事なら、Fruit クラスになるでしょう。また、実はある人の「好きなフルーツ」と「好きな色」の組み合わせなら、Favorites というクラスになるかもしれません。

クラスを作ることで、B クラスの情報の持ち方も変わってくるでしょう。フルーツの名前と色を別々に持つのではなく、「赤いリンゴ」や「オレンジ色のみかん」などの Fruit オブジェクトを管理する、という考え方に切り替えることになります。

java

1public class Fruit { 2 private String name; 3 private String color; 4 5 public Fruit(String name, String color) { 6 this.name = name; 7 this.color = color; 8 } 9 10 public String getName() { 11 return name; 12 } 13 14 public String getColor() { 15 return color; 16 } 17}

5) コールバック関数

最後におまけで、コールバック関数で情報を受け取る方法も書いてみます。(分からなかったら無視してください。)
例えば、一度に複数の組み合わせを処理したり、情報を非同期で受け取ったりする場合に使うと便利です。

java

1public class B { 2 public interface FruitCallback { 3 void call(String fruit, String color); 4 } 5 6 public void getFruit(FruitCallback callback) { 7 String fruit = "パイン"; 8 String color = "yellow"; 9 callback.call(fruit, color); 10 } 11}

呼び出し方 (匿名インナークラス)

java

1b.getFruit(new B.FruitCallback() { 2 public void call(String fruit, String color) { 3 System.out.println("好きなフルーツは" + color + "色の" + fruit + "です。"); 4 } 5});

呼び出し方 (ラムダ式の場合)

java

1b.getFruit((fruit, color) -> { 2 System.out.println("好きなフルーツは" + color + "色の" + fruit + "です。"); 3});

投稿2021/08/29 03:15

hoshi-takanori

総合スコア7895

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

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

0

Java初心者のため、いろいろな返し方(配列、オブジェクトetc)

いろいろあるようですが、わかっておらず
どなかたヒントでも構いませんのでご教授いただけませんでしょうか。。

まず、プログラミングっていうのは、方法です。
『こう書けばいい』というものではありません。

なので仕様によるとしか言えません。

単純に複数の文字列として返し、かつ意味ごと(色なら色だけとか)であれば、
配列でいいです。

ただし、一つのまとまりとしてであればクラスオブジェクトで返す。
たとえば、
色と名前をひとまとめにしたものとか。

今回はどのようにしたいのでしょうか。
というか、どういう仕様なのでしょうか。

たとえば、クラスBでの構造とか、
『必ずgetFruitとかみたいに分離しているのか』とか。

もし単純に『名前や色、取得できたかが欲しいだけ』であれば、

名前と色、取得できたかっていうのをクラスにまとめてそれを返すとか。

それに、クラスBがデザインパターンでいうFactoryパターンとかみたいに、なんらかの形で生成されて、getFruitを動かす前からすでに『取得できたかどうか』がわかるのなら、

isSuccessedメソッドとかを用意して、これで『取得できるかどうか』 をチェックして
trueならgetFruitとかで取得すればいいです。

そもそも仕様として『別のメソッドを追加することができない』ならクラスオブジェクトとして返すしかありませんね。

なので『仕様による』。

投稿2021/08/29 02:22

BeatStar

総合スコア4958

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問