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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

1631閲覧

条件によってインスタンス配列を変えたい

Blue-sea

総合スコア15

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/03/08 02:10

前提・実現したいこと

switch文によってList<>の<>に入れる部分を変えて
(同時に読み込むファイルも設定)
BufferedReaderを使ってList<?>に入れたい

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

どうすればいいのかわからなくなって混乱してます

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.util.ArrayList; 5import java.util.List; 6 7 8public class Main { 9 public static void main(String[] args) throws Exception { 10 int select = 0; 11 String csv = ""; 12 System.out.println(" 0 … 文系 (国語、社会、英語)"); 13 14 switch(select) { //CSVファイルの設定 15 case 0: csv = "studentArts.csv"; 16 List<Arts> Subject = new ArrayList<>(); 17 break; 18 (・・・caseを増やす予定・・・) 19 } 20 FRead(csv, Subject);//エラー・Subject を変数に解決できません 21 int size = list.size();//エラー・list を解決できません 22 //listにcsvのデータを入れ、読み込んだ行の数をカウントする 23} 24 public static void FRead(String filename, List<> list) {//エラー・型 List<E> の引数の数が誤っています。引数 <> でパラメーター化できません 25 File csv = new File(filename); 26 String line; 27 28 try { 29 BufferedReader br = new BufferedReader(new FileReader(csv)); 30 while ((line = br.readLine()) != null) { 31 list.add(line.split(", ")); 32 } 33 br.close(); 34 35 } catch (Exception e) { 36 System.out.println(e); 37 } 38 } 39

Arts

1public class Arts extends Student { 2 private int kokugo; //国語 3 private int shakai; //社会 4 private int eigo; //英語 5 6 Arts() { //コンストラクタ(引数なし:フィールドの初期化) 7 super.setStAll(0, "", ""); 8 this.setScAll(0, 0, 0); 9 } 10 11 Arts(int n) { //コンストラクタ(引数あり:フィールドの手動更新) 12 super.setNo(n); 13 this.setNamePoint(); 14 } 15 16 public int getKokugo() { 17 return this.kokugo; 18 } 19 20 public void setKokugo(int kokugo) { 21 this.kokugo= kokugo; 22 } 23 24 public int getshakai() { 25 return this.shakai; 26 } 27 28 public void setShakai(int shakai) { 29 this.shakai = shakai; 30 } 31 32 public int getEigo() { 33 return this.eigo; 34 } 35 36 public void setEigo(int eigo) { 37 this.eigo = eigo; 38 } 39} 40

Student

1public class Student { 2 private int no; 3 private String name; 4 private String gender; 5 6 public int getNo() { 7 return this.no; 8 } 9 10 public void setNo(int no) { 11 this.no = no; 12 } 13 public String getName() { 14 return this.name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public String getGender() { 22 return this.gender; 23 } 24 25 public void setGender(String gender) { 26 this.gender = gender; 27 } 28 29 public void setStAll(int no, String name, String gender) { 30 this.no = no; 31 this.name = name; 32 this.gender = gender; 33 } 34} 35
studentArts.csv 1, Aiba, 男, 46, 81, 48 2, Inoue, 女, 49, 64, 95 3, Ueda, 男, 51, 31, 45

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

java8
Eclipse4.10.1

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

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

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

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

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

jimbe

2019/03/09 12:57

「Javaでmainメソッドからreadメソッドを呼び出してArrayにcsvの内容を入れて返したい」 https://teratail.com/questions/177118 こちらからの続きでしょうか. 参考としてリンクを付けておいて頂けると, 回答する側にコードの出所が分かって良いかと思います.
Blue-sea

2019/03/12 02:22

分かりました。 次からはそうするようにします
guest

回答4

0

ベストアンサー

switch文によってList<>の<>に入れる部分を変えて

(同時に読み込むファイルも設定)
BufferedReaderを使ってList<?>に入れたい

この操作がswitch-case内で完結するなら可能です。

java

1 switch(select) { //CSVファイルの設定 2 case 0: 3 csv = "studentArts.csv"; 4 List<Arts> Subject = new ArrayList<>(); 5 FRead(csv, Subject); //これも正直よくわからんが… 6 int size = list.size(); 7 break; 8 (・・・caseを増やす予定・・・) 9 }

しかしこれではほとんど意味がないでしょう。かといってswitchの外に持っていこうとすると、各caseで異なるListの型が出てくるので、それをswitchの外で扱おうとするなら、その型の正体を持ち越すことができません。
何とかしようとするなら私にはこういうやり方しか思いつきません。

java

1List<? extends Student> students; 2String csv; 3switch(select) { 4 case 0: 5 csv = "studentArts.csv"; 6 students = new ArrayList<Arts>(); 7 FRead(csv, students); 8 int size = list.size(); 9 break; 10 11}

しかしこれも結局型情報が消えるので意味があまりありません。

おそらく、文系・理系別にどうこうしたいということでしょうから、
Studentの方にその情報を持たせ(文系・理系を表すフィールドをStudentクラスに設ける)、
一緒のList<Student>に詰めるという手法が現実的ではないかと思います。

投稿2019/03/10 15:45

swordone

総合スコア20649

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

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

Blue-sea

2019/03/12 02:25

これを参考にmainの始めにArts[] Art = new Arts[list.size]; を宣言してみたらコンパイルエラーは起きなくなりました。 他にSciences[] Sci = new Sciences[list.size];もあります。 これらをswitchでどちらかを実行したとき、使われなくても大丈夫なのでしょうか?
guest

0

java

1import java.io.*; 2import java.util.*; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 int select = 0; 7 String filename = null; 8 CsvRowObjectsFactory factory = null; 9 System.out.println(" 0 … 文系 (国語、社会、英語)"); 10 11 switch(select) { //CSVファイルの設定 12 case 0: 13 filename = "studentArts.csv"; 14 factory = new ArtsCROFactory(); 15 break; 16 //(・・・caseを増やす予定・・・) 17 } 18 List<? extends Student> list = readCSV(filename, factory); 19 int size = list.size(); 20 System.out.println("size="+size); 21 } 22 public static List<? extends Student> readCSV(String filename, CsvRowObjectsFactory factory) throws IOException { 23 try(BufferedReader br = new BufferedReader(new FileReader(new File(filename)))) { 24 for (String line; (line = br.readLine()) != null;) factory.add(line.split(", ")); 25 } 26 return factory.finish(); 27 } 28 29 interface CsvRowObjectsFactory { 30 void add(String[] items); 31 List<? extends Student> finish(); 32 } 33 static class ArtsCROFactory implements CsvRowObjectsFactory { 34 private List<Arts> list = new ArrayList<Arts>(); 35 @Override public void add(String[] items) { 36 Arts arts = new Arts(); 37 arts.setStAll(Integer.parseInt(items[0]), items[1], items[2]); 38 arts.setKokugo(Integer.parseInt(items[3])); 39 arts.setShakai(Integer.parseInt(items[4])); 40 arts.setEigo(Integer.parseInt(items[5])); 41 list.add(arts); 42 } 43 @Override public List<Arts> finish() { 44 List<Arts> tmp = new ArrayList<>(list); 45 list.clear(); 46 return tmp; 47 } 48 } 49}

わざわざ CSV を読む部分を共通にする必要があるのかが疑問に思います.
Arts extends Student も違和感を感じますが, とりあえずという感じでしょうか.

投稿2019/03/09 13:53

編集2019/03/09 14:17
jimbe

総合スコア12545

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

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

Blue-sea

2019/03/12 02:29

解答ありがとうございます。 確かにそうですね・・・。 csvファイルを増やしてswitch文を使って 読み分けることにしました。
jimbe

2019/03/12 07:28

Arts の他に Sciences もあるということで, switch に Sciences のコードも付け足された上で, どちらの場合も csv を読み込んだ後の処理を追加してみて頂けると, Arts, Sciences, Student の各クラス設計および CSV ファイルの読み込みメソッドの内容等, どういう形が出来るのかの回答も出るかと思います.
guest

0

switch文によってList<>の<>に入れる部分を変えて
(同時に読み込むファイルも設定)
BufferedReaderを使ってList<?>に入れたい

おそらく、public static void FRead(String filename, List<この中をクラス型としたいが特定のクラスだけではなく複数のクラスに対応> list)
それと同時にこの複数のクラスは.csvファイルにより決定する。
なので、List<>という書き方をし<この中>を書かなかった。なのでエラーが出てしまいます。
という事でOKでしょうか?

私もJavaは浅いので分かりませんがたぶん、できないと思います。
switch文で分けその先でそれぞれ固定のList<Arts>などとするしかありません。
固定の引数であるならできます。
引数渡しではありませんが例えばのサンプルを書いときます。
元のコードを基準に書いています。あしからず。

java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4//import java.io.IOException; 5import java.util.ArrayList; 6import java.util.List; 7 8public class readmain { 9 private static List<Arts> list = new ArrayList<Arts>(); 10 private static List<Tabemono> tlist = new ArrayList<Tabemono>(); 11 private static Arts arts; 12 private static Tabemono tabe; 13 14 public static void main(String[] args) throws Exception{ 15 int select = 1; //今回はこれが目的ではないのでファイル選択はここで直接変更する事とする。 16 String csv = ""; 17 System.out.println("0 … 文系 (国語、社会、英語)"); 18 System.out.println("1 … 食物系 (食べ物名)"); 19 20 switch(select) { //CSVファイルの設定 21 case 0: 22 csv = "C:/TestFolder/studentArts.csv"; 23 FRead(csv, select); 24 listout(select); 25 //List<Arts> Subject = new ArrayList<Arts>(); 26 break; 27 //(・・・caseを増やす予定・・・) 28 case 1: 29 csv = "C:/TestFolder/tabemono.csv"; 30 FRead(csv, select); 31 listout(select); 32 break; 33 default: 34 System.out.println("ファイルが存在しない番号を選びました。"); 35 break; 36 } 37 //int size = Subject.size();//エラー・list を解決できません 38 //listにcsvのデータを入れ、読み込んだ行の数をカウントする 39 40 } 41 42 private static void FRead(String filename, int sele) { 43 File csv = new File(filename); 44 String line; 45 46 try { 47 BufferedReader br = new BufferedReader(new FileReader(csv)); 48 while ((line = br.readLine()) != null) { 49 String[] onegyo = line.split(", "); //一旦配列に入れる。もっと良い方法があれば良いが。 50 switch(sele) { 51 case 0: 52 if (onegyo[0].startsWith("\uFEFF")) { 53 arts = new Arts(Integer.valueOf(onegyo[0].substring(1,onegyo[0].length())),onegyo[1],onegyo[2],Integer.valueOf(onegyo[3]),Integer.valueOf(onegyo[4]),Integer.valueOf(onegyo[5])); 54 } else { 55 //arts = new Arts();新しい実体を作成。それぞれの実体にデータを入れる。 56 //1つの実体を使いまわしその中にsetterを使い入れてもすべて最終のデータとなる 57 arts = new Arts(Integer.valueOf(onegyo[0]),onegyo[1],onegyo[2],Integer.valueOf(onegyo[3]),Integer.valueOf(onegyo[4]),Integer.valueOf(onegyo[5])); 58 //↑1行の代わりに以下の7行を使っても同じ。 59 //arts = new Arts(); 60 //arts.setNo(Integer.parseInt(onegyo[0])); 61 //arts.setName(onegyo[1]); 62 //arts.setGender(onegyo[2]); 63 //arts.setKokugo(Integer.parseInt(onegyo[3])); 64 //arts.setShakai(Integer.parseInt(onegyo[4])); 65 //arts.setEigo(Integer.parseInt(onegyo[5])); 66 } 67 list.add(arts); 68 break; 69 case 1: 70 //Windowsのメモ帳などでUTF-8で保存した場合1行目の先頭にはBOMと言う物が付いている 71 if (onegyo[0].startsWith("\uFEFF")) { 72 //付いている場合は除いた2文字目から取る 73 tabe = new Tabemono(Integer.parseInt(onegyo[0].substring(1,onegyo[0].length())), onegyo[1]); 74 }else { 75 //付いていない場合はそのまま取る 76 tabe = new Tabemono(Integer.parseInt(onegyo[0]), onegyo[1]); //Integer.valueOf(onegyo[0]) 77 } 78 79 tlist.add(tabe); 80 break; 81 } 82 } 83 br.close(); 84 85 } catch (Exception e) { 86 System.out.println(e); 87 } 88 } 89 90 private static void listout(int sele) { 91 Arts wcls; 92 Tabemono twcls; 93 String ws = ""; 94 95 switch(sele) { 96 case 0: 97 for (int a = 0; a < list.size(); a++) { 98 wcls = list.get(a); 99 ws = String.valueOf(wcls.getNo()) + ", " + wcls.getName() + ", " + wcls.getGender() + ", "; 100 ws += String.valueOf(wcls.getKokugo()) + ", " + String.valueOf(wcls.getShakai()) + ", " + String.valueOf(wcls.getEigo()); 101 System.out.println(ws); 102 } 103 break; 104 case 1: 105 for (int a = 0; a < tlist.size(); a++) { 106 twcls = tlist.get(a); 107 ws = String.valueOf(twcls.getTno()) + ", " + twcls.getNamae(); 108 System.out.println(ws); 109 } 110 break; 111 } 112 113 //System.out.println(System.getProperty("file.encoding")); 114 } 115}

java

1/** 教科クラス 2 */ 3public class Arts extends Student{ 4 private int kokugo; //国語 5 private int shakai; //社会 6 private int eigo; //英語 7 8 //コンストラクタ(引数なし:フィールドの初期化のみ) 9 public Arts() { 10 super.setStAll(0, "", ""); 11 this.setScAll(0, 0, 0); 12 } 13 14 //コンストラクタ(実体の作成と同時に引数でフィールドにセット) 15 public Arts(int no , String name, String gender, int kokugo,int shakai,int eigo) { 16 this.no = no; 17 this.name = name; 18 this.gender = gender; 19 this.kokugo = kokugo; 20 this.shakai = shakai; 21 this.eigo = eigo; 22 } 23 24 //コンストラクタ(引数あり:フィールドの手動更新) 25 //このコンストラクタは何をやりたかったのか不明なので保留 26 public Arts(int n) { 27 super.setNo(n); 28 //this.setNamePoint(); //フィールドに宣言されてもおらず不明 29 } 30 31 public int getKokugo() { 32 return this.kokugo; 33 } 34 35 public void setKokugo(int kokugo) { 36 this.kokugo= kokugo; 37 } 38 39 public int getShakai() { 40 return this.shakai; 41 } 42 43 public void setShakai(int shakai) { 44 this.shakai = shakai; 45 } 46 47 public int getEigo() { 48 return this.eigo; 49 } 50 51 public void setEigo(int eigo) { 52 this.eigo = eigo; 53 } 54 55 public void setScAll(int kokugo,int shakai,int eigo) { 56 this.kokugo = kokugo; 57 this.shakai = shakai; 58 this.eigo = eigo; 59 } 60 61}

java

1/** 生徒クラス(基底クラス) 2 */ 3public class Student { 4 protected int no; //Studentクラスと継承先のクラスで使えるようにprotectedで宣言 5 protected String name; 6 protected String gender; 7 8 //コンストラクタ(初期化) 9 public Student() { 10 this.setStAll(0, "", ""); 11 } 12 13 //コンストラクタ(同時にフィールドに代入。) 14 public Student(int no, String name, String gender) { 15 this.no = no; 16 this.name = name; 17 this.gender = gender; 18 } 19 20 public int getNo() { 21 return this.no; 22 } 23 24 public void setNo(int no) { 25 this.no = no; 26 } 27 public String getName() { 28 return this.name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public String getGender() { 36 return this.gender; 37 } 38 39 public void setGender(String gender) { 40 this.gender = gender; 41 } 42 43 public void setStAll(int no, String name, String gender) { 44 this.no = no; 45 this.name = name; 46 this.gender = gender; 47 } 48} 49

以下追加
Tabemono.java

java

1/**食べ物クラス**/ 2public class Tabemono { 3 private int _tno; 4 private String _namae; 5 6 public Tabemono() { 7 this._tno = 0; 8 this._namae = ""; 9 } 10 11 public Tabemono(int tno, String namae) { 12 this._tno = tno; 13 this._namae = namae; 14 } 15 16 public int getTno() { 17 return this._tno; 18 } 19 20 public void setTno(int value) { 21 this._tno = value; 22 } 23 24 public String getNamae() { 25 return this._namae; 26 } 27 28 public void setNamae(String value) { 29 this._namae = value; 30 } 31}

追加csv(Tabemono.csv)

csv

11, りんご 22, さしみ 33, ステーキ

ちなみに、int[] Art;はArtという単なる配列であり、Artsクラスとは何の関係もない事になります。
int[] abc;と同じです。

投稿2019/03/09 04:00

編集2019/03/09 07:53
shinami

総合スコア334

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

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

Blue-sea

2019/03/12 02:30

解答ありがとうございます。 インスタンス型配列を使うことで解決しました。
guest

0

まずは4点のコンパイルエラーを解決したらどうでしょう。

たくさんの問題点をそのままにしておくとBlue-seaさんの中でどうすればいいのかわからなくなって整理がつかなくなります。

RPGでボスを倒しに行くことしか考えてないため、その辺のモンスターから総攻撃を受け続けているのと近いイメージですね。まずその辺のモンスターを一掃してから次のステップに行きましょう。

BufferedReaderを使ってList<?>に入れたい

BufferedReaderのreadLineメソッドからもらえる値の型は文字列です。
文字列からList<?>に変換するためのクラスを、既存のライブラリから持ってくるか自作する必要があります。

自作されたかは存じませんが、おそらく、FReadはあくまでList<string[]>を取るためのメソッドなのではないでしょうか?

Java

1 public static void FRead<T>(String filename, List<string[]> list) { 2 String line; 3 4 try { 5 BufferedReader br = new BufferedReader(new FileReader(csv)); 6 while ((line = br.readLine()) != null) { 7 list.add(line.split(", ")); 8 } 9 br.close(); 10 11 } catch (Exception e) { 12 System.out.println(e); 13 } 14 }

Java

1 public static void main(String[] args) throws Exception { 2 int select = 0; 3 String csv = ""; 4 System.out.println(" 0 … 文系 (国語、社会、英語)"); 5 6 List<string[]> list = new ArrayList<> 7 FRead(csv, list); 8 int size = list.size(); 9 10 //NOTE: select = 何をキーにして分岐をする?読み込む?ファイル名? 11 12 switch(select) { 13 case 0: 14 csv = "studentArts.csv"; 15 List<Arts> Subject = new ArrayList<>(); 16 //TODO:listに入っているstring[]をArtsに変える処理を追加 17 break; 18 (・・・caseを増やす予定・・・) 19 } 20 }

投稿2019/03/08 03:42

編集2019/03/08 03:49
BluOxy

総合スコア2663

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

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

Blue-sea

2019/03/08 04:55

ネットで調べてきになっていたのですが、 List<Art>の中身は int[] Art = new int[?(とりあえず20は設定し、データによって変わる)] といった感じにArtが配列化したものと考えていいのでしょうか?
BluOxy

2019/03/08 06:34 編集

知りたいことが何か要領を得られませんでしたが、リストと配列は違うデータ構造です。 int[] Artの場合、あくまで「int型の配列」です。 List<Art>の場合、あくまで「Art型のリスト」です。 List<Art> SubjectとArt[] Subjectはどちらも「Art型が入ったデータ構造」と考えて良いですが、Listと配列は別物です。 int[] Artは配列の型がArtなのではなく、変数名がArtなだけなので、全然別物です。
Blue-sea

2019/03/12 02:31

なるほど、勉強になります。 知恵を貸していただきありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問