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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Eclipse

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

Q&A

解決済

1回答

531閲覧

ファイルを読み込んで、4行で表されている選手成績それぞれを配列にして格納し、1行でコンソールに表示したい

hedgehogs

総合スコア15

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Eclipse

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

0グッド

0クリップ

投稿2022/09/18 14:27

前提

Javaの勉強をしています。
以前、「4行で表されている選手成績を1行でコンソールに表示したい」について回答を頂き一度は解決しました。
しかし、より改善したいと思い、方法を考えているのですが方法がわかりません。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 1行目から4行目にある項目を1個の配列に格納したい。
  • そのうち4行目にある24項目もそれぞれ分割し、要素数27の配列として、1つの配列に入れたい。
  • 4行目の24項目にひとつでも数値がはいってなければ、エラーを表示するなどするようにして、行が1つ抜けているなどの場合に気づけるよう精度を高めたい。

該当のソースコード

メインクラス

java

1package baseball; 2 3import java.io.BufferedReader; 4import java.io.File; 5import java.io.FileInputStream; 6import java.io.InputStreamReader; 7import java.util.ArrayList; 8import java.util.List; 9 10public class Challenge5 { 11 private static final String FILE_PATH = "C:\\Users\\user name \\Documents\\workspace-spring-tool-suite-4-4.15.3.RELEASE\\test 1st\\dat\\pro.csv"; 12 13 public static void main(String[] args) { 14 File file = new File(FILE_PATH); 15 16 try (FileInputStream fis = new FileInputStream(file); 17 InputStreamReader isr = new InputStreamReader(fis); 18 BufferedReader br = new BufferedReader(isr);) { 19 20 21 List<Pro> pros = new ArrayList<>(); 22 String line; 23 24 25 while ((line = br.readLine()) != null) { 26 String[] strs = {line,br.readLine(), br.readLine(), br.readLine() }; 27 28 // コンストラクタをオーバロードして呼び出し 29 Pro pro = new Pro(strs); 30 pros.add(pro); 31 32 } 33 34 for (Pro pro1 : pros) { 35 System.out.println(pro1); 36 37 } 38 39 } catch (Exception e) { 40 e.printStackTrace(); 41 42 } 43 } 44} 45 46

Proクラス

java

1package baseball; 2 3public class Pro { 4 private String 順位; 5 private String 選手名; 6 private String 球団; 7 private String 打率; 8 //4行目2列目以降の各データ 9 private String 試合; 10 private String 打席; 11 private String 打数; 12 private String 安打; 13 private String 二塁打; 14 private String 三塁打; 15 private String 本塁打; 16 private String 塁打; 17 private String 打点; 18 private String 得点; 19 private String 三振; 20 private String 四球; 21 private String 死球; 22 private String 犠打; 23 private String 犠飛; 24 private String 盗塁; 25 private String 盗塁死; 26 private String 併殺打; 27 private String 出塁率; 28 private String 長打率; 29 private String OPS; 30 private String 得点圏; 31 private String 失策; 32 33 //読みこんだデータの格納 34 public Pro(String[] pros) { 35 this.set順位(pros[0]); 36 this.set選手名(pros[1]); 37 this.set球団(pros[2]); 38 this.set打率(pros[3]); 39 //4行目2列目以降のデータ 40 this.set試合(pros[4]); 41 this.set打席(pros[5]); 42 this.set打数(pros[6]); 43 this.set安打(pros[7]); 44 this.set二塁打(pros[8]); 45 this.set三塁打(pros[9]); 46 this.set本塁打(pros[10]); 47 this.set塁打(pros[11]); 48 this.set打点(pros[12]); 49 this.set得点(pros[13]); 50 this.set三振(pros[14]); 51 this.set四球(pros[15]); 52 this.set死球(pros[16]); 53 this.set犠打(pros[17]); 54 this.set犠飛(pros[18]); 55 this.set盗塁(pros[19]); 56 this.set盗塁死(pros[20]); 57 this.set併殺打(pros[21]); 58 this.set出塁率(pros[22]); 59 this.set長打率(pros[23]); 60 this.setOPS(pros[24]); 61 this.set得点圏(pros[25]); 62 this.set失策(pros[26]); 63 } 64 65 public String get順位() { 66 return 順位; 67 } 68 69 public void set順位(String 順位) { 70 this.順位 = 順位; 71 } 72 73 public String get選手名() { 74 return 選手名; 75 } 76 77 public void set選手名(String 選手名) { 78 this.選手名 = 選手名; 79 } 80 81 public String get球団() { 82 return 球団; 83 } 84 85 public void set球団(String 球団) { 86 this.球団 = 球団; 87 } 88 89 public String get打率() { 90 return 打率; 91 } 92 93 public void set打率(String 打率) { 94 this.打率 = 打率; 95 } 96 97 public String get試合() { 98 return 試合; 99 } 100 101 public void set試合(String 試合) { 102 this.試合 = 試合; 103 } 104 105 public String get打席() { 106 return 打席; 107 } 108 109 public void set打席(String 打席) { 110 this.打席 = 打席; 111 } 112 113 public String get打数() { 114 return 打数; 115 } 116 117 public void set打数(String 打数) { 118 this.打数 = 打数; 119 } 120 121 public String get安打() { 122 return 安打; 123 } 124 125 public void set安打(String 安打) { 126 this.安打 = 安打; 127 } 128 129 public String get二塁打() { 130 return 二塁打; 131 } 132 133 public void set二塁打(String 二塁打) { 134 this.二塁打 = 二塁打; 135 } 136 137 public String get三塁打(){ 138 return 三塁打; 139 } 140 141 public void set三塁打(String 三塁打) { 142 this.三塁打 = 三塁打; 143 } 144 145 public String get本塁打(){ 146 return 本塁打; 147 } 148 149 public void set本塁打(String 本塁打) { 150 this.本塁打 = 本塁打; 151 } 152 153 public String get塁打(){ 154 return 塁打; 155 } 156 157 public void set塁打(String 塁打) { 158 this.塁打 = 塁打; 159 } 160 161 public String get打点(){ 162 return 打点; 163 } 164 165 public void set打点(String 打点) { 166 this.打点 = 打点; 167 } 168 169 public String get得点(){ 170 return 得点; 171 } 172 173 public void set得点(String 得点) { 174 this.得点 = 得点; 175 } 176 177 public String get三振(){ 178 return 三振; 179 } 180 181 public void set三振(String 三振) { 182 this.三振 = 三振; 183 } 184 185 public String get四球(){ 186 return 四球; 187 } 188 189 public void set四球(String 四球) { 190 this.四球 = 四球; 191 } 192 193 public String get死球(){ 194 return 死球; 195 } 196 197 public void set死球(String 死球) { 198 this.死球 = 死球; 199 } 200 201 public String get犠打(){ 202 return 犠打; 203 } 204 205 public void set犠打(String 犠打) { 206 this.犠打 = 犠打; 207 } 208 209 public String get犠飛(){ 210 return 犠飛; 211 } 212 213 public void set犠飛(String 犠飛) { 214 this.犠飛 = 犠飛; 215 } 216 217 public String get盗塁(){ 218 return 盗塁; 219 } 220 221 public void set盗塁(String 盗塁) { 222 this.盗塁 = 盗塁; 223 } 224 225 public String get盗塁死(){ 226 return 盗塁死; 227 } 228 229 public void set盗塁死(String 盗塁死) { 230 this.盗塁死 = 盗塁死; 231 } 232 233 public String get併殺打(){ 234 return 併殺打; 235 } 236 237 public void set併殺打(String 併殺打) { 238 this.併殺打 = 併殺打; 239 } 240 241 public String get出塁率(){ 242 return 出塁率; 243 } 244 245 public void set出塁率(String 出塁率) { 246 this.出塁率 = 出塁率; 247 } 248 249 public String get長打率(){ 250 return 長打率; 251 } 252 253 public void set長打率(String 長打率) { 254 this.長打率 = 長打率; 255 } 256 257 public String getOPS(){ 258 return OPS; 259 } 260 261 public void setOPS(String OPS) { 262 this.OPS = OPS; 263 } 264 265 public String get得点圏(){ 266 return 得点圏; 267 } 268 269 public void set得点圏(String 得点圏) { 270 this.得点圏 = 得点圏; 271 } 272 273 public String get失策(){ 274 return 失策; 275 } 276 277 public void set失策(String 失策) { 278 this.失策 = 失策; 279 } 280 281 //オーバーライド 282 public String toString() { 283 return 284 "順位=" + this.get順位() + 285 ", 選手名=" + this.get選手名() + 286 ", 球団=" + this.get球団() + 287 ", 打率=" + this.get打率() + 288 ", 試合=" + this.get試合() + 289 ", 打席=" + this.get打席() + 290 ", 打数=" + this.get打数() + 291 ", 安打=" + this.get安打() + 292 ", 二塁打=" + this.get二塁打() + 293 ", 三塁打=" + this.get三塁打() + 294 ", 本塁打=" + this.get本塁打() + 295 ", 塁打=" + this.get塁打() + 296 ", 打点=" + this.get打点() + 297 ", 得点=" + this.get得点() + 298 ", 三振=" + this.get三振() + 299 ", 四球=" + this.get四球() + 300 ", 犠打=" + this.get犠打() + 301 ", 犠飛=" + this.get犠飛() + 302 ", 盗塁=" + this.get盗塁() + 303 ", 併殺打=" + this.get併殺打() + 304 ", 出塁率=" + this.get出塁率() + 305 ", 長打率=" + this.get長打率() + 306 ", OPS=" + this.getOPS() + 307 ", 得点圏=" + this.get得点圏() + 308 ", 失策=" + this.get失策() ; 309 310 } 311}
1 村上 (ヤ) .340 115 496 394 134 17 0 49 298 120 95 97 97 5 0 0 12 6 5 .476 .756 1.232 .376 12 2 大島 (中) .323 82 367 337 109 11 1 1 125 15 35 42 21 7 2 0 7 3 1 .375 .371 .746 .246 0 3 佐野 (デ) .320 101 438 406 130 26 1 17 209 57 48 44 28 3 0 1 0 1 10 .368 .515 .882 .289 4 4 宮﨑 (デ) .308 93 373 334 103 22 0 9 152 34 39 25 35 2 0 2 0 0 11 .375 .455 .830 .254 5 5 近本 (神) .293 110 485 441 129 14 1 1 148 25 58 50 35 6 3 0 23 5 7 .353 .336 .688 .314 2 6 坂倉 (広) .289 121 505 456 132 17 3 12 191 56 64 72 37 8 0 4 1 1 13 .350 .419 .769 .295 13 7 牧 (デ) .288 103 437 389 112 28 1 22 208 70 55 65 34 8 0 コード

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

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

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

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

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

jimbe

2022/09/18 18:18 編集

大まかに全体が分からないというのでは、丸投げのようになってしまいます。 もっと小さく、こうなると考えてこう書いたがこうだと出来るがこうではこうなってしまう…的な大きさまでやってみては如何でしょうか。 また Pro クラスの構造ですが、多数のデータ一つ々々に変数やアクセサを作るなではなく、 Map のようにまとめて扱える構造を用いる方が良いと思います。
m.ts10806

2022/09/19 05:46

Spring無関係では。
hedgehogs

2022/09/19 17:06

自分の考えを記載せず、丸投げのようになってしまい申し訳ございません。 それにも関わらず、回答いただきありがとうございます。 一点ご質問なのですが、 stage++;としたあとに return canShipping(); の処理順序は、 boolean canShipping() { return stage == 5; } に飛ぶのでしょうか? stage++でswith処理が変わりMapに格納できるまではわかるのですが、その後のreturn canShipping();で飛ぶ処理場所と、処理のされかたがわからず。。
jimbe

2022/09/19 17:24 編集

回答にもコメントが書けますので、個々の回答への質問はそちらにお願いします。 return canShipping() は、canShipping メソッドを呼んでその返り値をそのまま setList メソッドの返り値としています。 boolean a = canShipping(); return a; を纏めることで余計な変数(a)が要らなくなります。 わざわざ stage == 5 をメソッドにしているのは、setList が返している値が何なのかをメソッド名としてコード上に示す( コメントを付けて『return stage == 5; //発送可能か』とするのと同じ)意味や、 isShipped メソッドと合わせて stage の値の意味を表しているつもりです。 きっちりやるなら、 "5" という値が生成段階の最後というのが絶対変わらないとは限らないので、 stage で判断するのではなく発送可不可のフラグ変数を操作する形になるかもしれません。
m.ts10806

2022/09/20 08:12 編集

質問は編集できますので。
guest

回答1

0

ベストアンサー

Pro クラスの中身を Map 化し、キーを enum にしています。
ファイルから読んだ行の解釈は Pro.Factory クラスが行っています。prepare → setLine ×4回 → ship の繰り返しでデータをリストに溜めます。
行に異常があったりした場合は例外を発しますが、提示された最後のデータが異常があるため、正常実行時はそのデータをコメント化("#")しました。

ProBBPlayers.java

java

1import java.io.*; 2import java.util.*; 3 4public class ProBBPlayers { 5 public static void main(String[] args) throws IOException { 6 7 try(FileInputStream fis = new FileInputStream(new File("baseball.txt")); 8 InputStreamReader isr = new InputStreamReader(fis); 9 BufferedReader br = new BufferedReader(isr);) { 10 11 List<Pro> proList = new ArrayList<>(); 12 13 Pro.Factory factory = new Pro.Factory(); 14 for(String line; (line = br.readLine()) != null; ) { 15 if(line.startsWith("#")) continue; //コメント 16 if(factory.isShipped()) factory.prepare(); 17 if(factory.setLine(line)) proList.add(factory.ship()); 18 } 19 if(!factory.isShipped()) throw new IOException("データが途中で切れている"); 20 21 for(Pro pro : proList) System.out.println(pro); 22 } 23 } 24} 25 26class Pro { 27 static class Factory { 28 private Pro product; 29 private int stage = 0; 30 31 void prepare() { 32 product = new Pro(); 33 stage = 1; 34 } 35 36 boolean setLine(String line) { 37 switch(stage) { 38 case 1: 39 product.set(Info.順位, line.split("\t")[0]); 40 break; 41 case 2: 42 product.set(Info.選手名, line); 43 break; 44 case 3: 45 product.set(Info.球団, line); 46 break; 47 case 4: 48 String[] values = line.split("\t"); 49 if(values.length != Info.FROM_LINE4.length) throw new IllegalArgumentException("行内のデータが過不足"); 50 for(int i=0; i<Info.FROM_LINE4.length; i++) product.set(Info.FROM_LINE4[i], values[i]); 51 break; 52 default: 53 throw new IllegalStateException("生成段階異常"); 54 } 55 stage ++; 56 return canShipping(); 57 } 58 59 Pro ship() { 60 if(!canShipping()) throw new IllegalStateException("生成が完了していない, もしくは既に生成済み"); 61 stage = 0; 62 return product; 63 } 64 65 boolean canShipping() { return stage == 5; } 66 boolean isShipped() { return stage == 0; } 67 } 68 69 enum Info { 70 順位, 71 選手名, 72 球団, 73 打率, 試合, 打席, 打数, 安打, 74 二塁打, 三塁打, 本塁打, 塁打, 打点, 75 得点, 三振, 四球, 死球, 犠打, 76 犠飛, 盗塁, 盗塁死, 併殺打, 出塁率, 77 長打率, OPS, 得点圏, 失策; 78 79 static final Info[] FROM_LINE4 = new Info[] { 80 打率, 試合, 打席, 打数, 安打, 81 二塁打, 三塁打, 本塁打, 塁打, 打点, 82 得点, 三振, 四球, 死球, 犠打, 83 犠飛, 盗塁, 盗塁死, 併殺打, 出塁率, 84 長打率, OPS, 得点圏, 失策 85 }; 86 } 87 88 private Map<Info,String> infoMap = new HashMap<>(); 89 90 void set(Info info, String value) { infoMap.put(info, value); } 91 String get(Info info) { return infoMap.get(info); } 92 93 @Override 94 public String toString() { 95 StringJoiner sj = new StringJoiner(", "); 96 for(Info info : Info.values()) sj.add(info + "=" + infoMap.get(info)); 97 return sj.toString(); 98 } 99}

baseball.txt (最後の4行をコメントにしています)

plain

11 2村上 3(ヤ) 4.340 115 496 394 134 17 0 49 298 120 95 97 97 5 0 0 12 6 5 .476 .756 1.232 .376 12 52 6大島 7(中) 8.323 82 367 337 109 11 1 1 125 15 35 42 21 7 2 0 7 3 1 .375 .371 .746 .246 0 93 10佐野 11(デ) 12.320 101 438 406 130 26 1 17 209 57 48 44 28 3 0 1 0 1 10 .368 .515 .882 .289 4 134 14宮﨑 15(デ) 16.308 93 373 334 103 22 0 9 152 34 39 25 35 2 0 2 0 0 11 .375 .455 .830 .254 5 175 18近本 19(神) 20.293 110 485 441 129 14 1 1 148 25 58 50 35 6 3 0 23 5 7 .353 .336 .688 .314 2 216 22坂倉 23(広) 24.289 121 505 456 132 17 3 12 191 56 64 72 37 8 0 4 1 1 13 .350 .419 .769 .295 13 25#7 26#牧 27#(デ) 28#.288 103 437 389 112 28 1 22 208 70 55 65 34 8 0

実行結果

plain

1順位=1, 選手名=村上, 球団=(ヤ), 打率=.340, 試合=115, 打席=496, 打数=394, 安打=134, 二塁打=17, 三塁打=0, 本塁打=49, 塁打=298, 打点=120, 得点=95, 三振=97, 四球=97, 死球=5, 犠打=0, 犠飛=0, 盗塁=12, 盗塁死=6, 併殺打=5, 出塁率=.476, 長打率=.756, OPS=1.232, 得点圏=.376, 失策=12 2順位=2, 選手名=大島, 球団=(中), 打率=.323, 試合=82, 打席=367, 打数=337, 安打=109, 二塁打=11, 三塁打=1, 本塁打=1, 塁打=125, 打点=15, 得点=35, 三振=42, 四球=21, 死球=7, 犠打=2, 犠飛=0, 盗塁=7, 盗塁死=3, 併殺打=1, 出塁率=.375, 長打率=.371, OPS=.746, 得点圏=.246, 失策=0 3順位=3, 選手名=佐野, 球団=(デ), 打率=.320, 試合=101, 打席=438, 打数=406, 安打=130, 二塁打=26, 三塁打=1, 本塁打=17, 塁打=209, 打点=57, 得点=48, 三振=44, 四球=28, 死球=3, 犠打=0, 犠飛=1, 盗塁=0, 盗塁死=1, 併殺打=10, 出塁率=.368, 長打率=.515, OPS=.882, 得点圏=.289, 失策=4 4順位=4, 選手名=宮﨑, 球団=(デ), 打率=.308, 試合=93, 打席=373, 打数=334, 安打=103, 二塁打=22, 三塁打=0, 本塁打=9, 塁打=152, 打点=34, 得点=39, 三振=25, 四球=35, 死球=2, 犠打=0, 犠飛=2, 盗塁=0, 盗塁死=0, 併殺打=11, 出塁率=.375, 長打率=.455, OPS=.830, 得点圏=.254, 失策=5 5順位=5, 選手名=近本, 球団=(神), 打率=.293, 試合=110, 打席=485, 打数=441, 安打=129, 二塁打=14, 三塁打=1, 本塁打=1, 塁打=148, 打点=25, 得点=58, 三振=50, 四球=35, 死球=6, 犠打=3, 犠飛=0, 盗塁=23, 盗塁死=5, 併殺打=7, 出塁率=.353, 長打率=.336, OPS=.688, 得点圏=.314, 失策=2 6順位=6, 選手名=坂倉, 球団=(広), 打率=.289, 試合=121, 打席=505, 打数=456, 安打=132, 二塁打=17, 三塁打=3, 本塁打=12, 塁打=191, 打点=56, 得点=64, 三振=72, 四球=37, 死球=8, 犠打=0, 犠飛=4, 盗塁=1, 盗塁死=1, 併殺打=13, 出塁率=.350, 長打率=.419, OPS=.769, 得点圏=.295, 失策=13

投稿2022/09/18 19:50

編集2022/09/18 19:53
jimbe

総合スコア12543

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問