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

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

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

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

配列

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

Q&A

解決済

3回答

2172閲覧

Javaでこんなメソッドを作りたい

tiqua_nibio

総合スコア62

Java

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

配列

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

0グッド

1クリップ

投稿2020/04/18 14:38

編集2020/04/18 14:39

Java

1 2public List<String> arrayzAsList(....){ 3 4//....にはStringまたはList<String>のいずれかがいくつか並ぶ。Arrays.asList(.....)と同じパターン。 5 6List<String> rtrn = new ArrayList<String>; 7 8//List<String> は分解してString1個ずつrtrnにaddする。 9//Stringはそのままrtrnにaddする。 10//最終的にrtrnとして返す。 11 12return rtrn; 13 14}

Java

1 2List<String> a = new ArrayList<String>(); 3 4a.add("a"); 5a.add("b"); 6a.add("c"); 7 8List<String> z = arrayzAsList("d", a, "e", a); 9 10System.out.println(z); 11//["d", "a", "b", "c", "e", "a", "b", "c"] 12 13

メソッドarrayzAsListを作れたらありがたいです。よろしくお願いいたします。上記2つとも同じクラス内にあるものとします。

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

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

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

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

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

gentaro

2020/04/18 14:43

> メソッドarrayzAsListを作れたらありがたいです。よろしくお願いいたします。上記2つとも同じクラス内にあるものとします。 https://teratail.com/help/avoid-asking 「何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」
y_waiwai

2020/04/18 14:44

どんなメソッドでしょうか。いまいち意味不明です
LouiS0616

2020/04/18 14:56

arrayzAsList(a, "d", "e") とか arrayzAsList("d", a, a) にも対応させたいのでしょうか?
tiqua_nibio

2020/04/18 15:18

>arrayzAsList(a, "d", "e") とか arrayzAsList("d", a, a) にも対応させたいのでしょうか? はい、そうです。
tiqua_nibio

2020/04/18 15:19

>これ? そうです。(T... a)のところには、いくつも並ぶという意味ですよね。これをStringまたはList<String>などが並ぶということです。この部分でハマりました。
tiqua_nibio

2020/04/18 15:21

>どんなメソッドでしょうか。いまいち意味不明です SQLのデータベースのカラムが多くなりすぎたので、SQLを生成するコードを書いています。また、リファクタリングでもあります。
tiqua_nibio

2020/04/18 15:23

>「何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。」 それをおっしゃるということであれば、答えられる自信があるのではと推測します。 学校の課題などではありません。一歩進んだ目的があってのことです。
LouiS0616

2020/04/18 15:31

別の言語を使うことも選択肢に入れてみてはどうでしょうか。 前回の質問 https://teratail.com/questions/253768 もそうですけれど、容易に実現できないのは言語の思想も絡んでいるわけで。
gentaro

2020/04/18 15:34

> 学校の課題などではありません。一歩進んだ目的があってのことです。 じゃあそれを説明し、ガイドラインに目を通した上で「丸投げの質問ではない」証明をお願いします。
退会済みユーザー

退会済みユーザー

2020/04/18 15:37

一歩進んだなら JPAとかつかうから詰め替えの実装なんて発生しないよ
tiqua_nibio

2020/04/18 15:38

>じゃあそれを説明し、ガイドラインに目を通した上で「丸投げの質問ではない」証明をお願いします。 Object o o instanceof List<String> がエラーになるから、質問しているのです。丸投げと決めつけないでください。
tiqua_nibio

2020/04/18 15:40

>別の言語を使うことも選択肢に入れてみてはどうでしょうか。 ご意見ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/04/18 15:40

試してエラーになったことを書かなければそれはやってないことと同じです。
swordone

2020/04/18 17:21

> Object o o instanceof List<String> がエラーになるから、質問しているのです。丸投げと決めつけないでください。 じゃあ最初からそう書きなさいよ。
tiqua_nibio

2020/04/19 01:29

皆さん色々と批判されているようですが、私にとっては重要な質問の一つであり、答えを提示いただくことで色々と前進することにつながります。 批判する前に、まず技術的に難しいのではないか、などの建設的なコメントを頂けないかと少しがっかりしております。
guest

回答3

0

Java

1public class Formatter { 2 3 4 public static List<String> arrayzAsList(Object... a) { 5 6 List<String> list_str = new ArrayList<String>(); 7 8 for (Object o : a) { 9 10 if (o instanceof String) { 11 12 list_str.add((String) o); 13 14 } else if (o instanceof ListString) { 15 16 ListString ls = (ListString) o; 17 18 for (String temp_str : ls.getList_Str()) { 19 20 list_str.add(temp_str); 21 22 } 23 24 } 25 26 } 27 28 return list_str; 29 } 30 31 public class ListString { 32 33 public ListString(List<String> list_str) { 34 35 this.list_str = list_str; 36 37 } 38 39 private List<String> list_str; 40 41 public List<String> getList_Str() { 42 43 return list_str; 44 45 } 46 47 public void setList_Str(List<String> list_str) { 48 49 this.list_str = list_str; 50 51 } 52 53 } 54 55 public static void main(String[] args) throws NoSuchAlgorithmException { 56 57 ListString ls_1 = new Formatter().new ListString(Arrays.asList("tata", "nana", "haha")); 58 ListString ls_2 = new Formatter().new ListString(Arrays.asList("yaya", "rara")); 59 60 System.out.println(arrayzAsList("sasa", ls_1, "mama", ls_2)); 61 62 //[sasa, tata, nana, haha, mama, yaya, rara] 63 64 } 65 66} 67

投稿2020/04/18 16:18

tiqua_nibio

総合スコア62

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

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

0

ベストアンサー

java

1 public static List<String> arrayzAsList(Object... objs) { 2 List<String> ans = new ArrayList<String>(); 3 for (Object obj : objs) { 4 if (obj instanceof String) { 5 ans.add((String) obj); 6 } else if (obj instanceof List) { 7 for (String s : (List<String>) obj) { 8 ans.add(s); 9 } 10 } 11 } 12 return ans; 13 }

実行例:
イメージ説明

追記 2020--4-19
exception 処理する例をつくりました。
(でも本当は、 可変長引数にするのをやめて、 List<String> の配列を引数にするのが良いです。
(String は 要素数 1 の List<string> にすればよいです。そうすれば、 instanceof でチェックする必要がなくなります。)

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Main { 5 public static void main(String[] args) { 6 List<String> a = new ArrayList<String>(); 7 a.add("a"); 8 a.add("b"); 9 a.add("c"); 10 List<String> z = arrayzAsList("d", a, "e", a); 11 System.out.println(z); 12 13 List<Object> b = new ArrayList<Object>(); 14 b.add(1); 15 b.add(1.2); 16 b.add('c'); 17 arrayzAsList(b, 10, 12.3, 'Z'); 18 } 19 20 public static List<String> arrayzAsList(Object... objs) throws IllegalArgumentException { 21 String errors = ""; 22 List<String> ans = new ArrayList<String>(); 23 for (Object obj : objs) { 24 if (obj instanceof String) { 25 ans.add((String) obj); 26 } else if (obj instanceof List<?>) { 27 for (Object e : (List<?>)obj) { 28 try { 29 ans.add((String)e); 30 } catch (ClassCastException exp) { 31 errors += "\n " + e + " (" + obj.getClass().toString() + ")"; 32 } 33 } 34 } else { 35 errors += "\n " + obj + " (" + obj.getClass().toString() + ")"; 36 } 37 } 38 39 if (errors.length() > 0) { 40 throw new IllegalArgumentException(errors); 41 } 42 return ans; 43 } 44}

実行例:
イメージ説明

追記 その2

メソッドの引数を 可変長でなく、 List<List<String>> にしてみました。
イメージ説明

投稿2020/04/18 16:17

編集2020/04/19 07:45
katoy

総合スコア22324

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

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

tiqua_nibio

2020/04/18 16:24

ありがとうございます。 私も回答を書いてみたのですが、私の回答よりもかんたんに書かれていますね。ジェネリクスを書かないのがポイントのようですね。
katoy

2020/04/18 16:27

こらはタイプチェックが甘いです。 lList<String> や String 以外が渡ってきたときは破綻します。
jimbe

2020/04/18 18:09 編集

いっそ for 文の中は if(obj instanceof List) { for(Object o : (List<?>)obj) ans.add(o.toString()); } else { ans.add(obj.toString()); } でも良いのではないでしょうか.
tiqua_nibio

2020/04/19 01:37

ありがとうございます。 >いっそ for 文の中は Exception処理はどうやって入れたらよろしいでしょうか? katoyさんのコードに最後にelse節があればできそうですね。
tiqua_nibio

2020/04/19 01:38

>lList<String> や String 以外が渡ってきたときは破綻します。 Exception処理を入れられればなんとかなりそうです。 ですが、コード的に私のように別のクラスを作らなくてすむという意味で、スッキリしていると思いました。参考にさせていただきたいと思います。
katoy

2020/04/19 02:22

exception 処理する例を回答に追記しました。 ここでは すべての不正データをみつけられうようにしてますが、 単位 全体を try .. catch で囲むだけでも十分かもしれません。
jimbe

2020/04/19 03:31 編集

> Exception処理はどうやって入れたら String も List も, そして引数も List の中身も Object ですので, Object として扱う限りはキャスト例外は発生しないと思うのですが...(回答に追加されました数値を含む List を渡されても発生しません.) 他の例外で何が発生するとお考えでしょうか.
katoy

2020/04/19 03:30

2 つめの回答例では、 List<object> の要素に String 以外 int, float を入れています。 メソッドが返す List<STring> には String だけしか入れられません。 int や fllot なども .toString() して STring に変換していれるという案もありますが、 ここでは、(string)e として 入れるようにしています。このキャスト部分で例外が発生します。
jimbe

2020/04/19 03:35 編集

私のコメントは >いっそ for 文の中は で提案させて頂いた ".toString() して String に変換していれるという案" でのことです. 紛らわしくてすいません.
jimbe

2020/04/19 03:45

ただ, キャストによる例外の対処まで含めるとなりますと, java としては「戦略の不味さを戦術でカバー」しているような印象を受けます. このメソッドが必要になるという対処方法自体, もしくはより根本的なレベルから再考される余地があるのではとも考えてしまいます. "リファクタリング" とも言われていますので, その過程での一時的な対処であれば仕方ないのかも知れませんが...
tiqua_nibio

2020/04/19 04:58

> exception 処理する例を回答に追記しました。 ありがとうございます。こちらも大変参考になります。
tiqua_nibio

2020/04/19 05:01

>"リファクタリング" とも言われていますので, その過程での一時的な対処であれば仕方ないのかも知れませんが... 当方、データベースでupdateをするときに、特定のカラムのみを更新したいというときに、List<String>にそのカラム名のリストを入れ、それを更新後の値とともにあるメソッドに入れれば、更新してくれるというものを作動させています。 カラムが多くなりすぎましたので、一部のカラムをグループ化して、List<String>にして他のカラムとarrayzAsListで一つのList<String>にしているというものです。 大変便利で、数百行のコードが一行になりました。
jimbe

2020/04/19 05:49

なるほど. ということは扱われる各要素はまず String 以外あり得ないのですね. キャスト例外が発生するとすれば(カラム名に数値が入るとは思えませんので)使い方を間違えている場合ということになりますか. とすればキャスト例外が発生したとすればバグということになりますし, それはそのまま上位メソッドに伝搬するだけで良いのかもしれません.
tiqua_nibio

2020/04/19 07:20

はい、ユーザー側の操作によるバグというよりは開発者側のバグということになりそうです。カラム名ですので、String型のみとなります。 上位へ伝える形に進めております。
katoy

2020/04/19 07:47

可変長引数でなく、 List<List<String>> にしたもの回答の 追記 2 として書きました。
tiqua_nibio

2020/04/19 15:12

List<List<String>>という方法もありますね。 昔、少し複雑なコードを書いたときに試してみたことがありました。 ジェネリクスが重なっているので、見栄えを考慮して新しいクラスを作ったりなどをしていました。 またstreamなどのメソッドは奥が深いと思います。
guest

0

StringとListを同列に扱うにはObjectを使うしかないので、やるとしたらこうです。

java

1public List<String> arrayzAsList(Object... objs)

ただし、色々と面倒です。

投稿2020/04/18 15:03

swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問