🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

569閲覧

Javaで、各データを計算したいのですが

Keita222

総合スコア8

Java

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

0グッド

2クリップ

投稿2020/01/02 06:45

編集2020/01/03 07:55

前提・実現したいこと

Javaで、データの各選手の出塁率を出力したいと思っています。
データの一部は下記のような感じです。

play,1,0,lindf001,22,BCBSX,8/L+,1,1,0outcount,000,0,0,1,"J.C. Ramirez",0,0,Norunner,0scoring
play,1,0,kipnj001,12,CBCX,31/G,1,2,1outcount,000,0,0,1,"J.C. Ramirez",0,0,Norunner,0scoring
play,1,0,ramij003,12,CBSFFX,31/G,1,3,2outcount,000,0,0,1,"J.C. Ramirez",0,0,Norunner,0scoring
play,1,1,cozaz001,00,X,8/F,1,1,0outcount,000,0,0,1,"Mike Clevinger",0,0,Norunner,0scoring
play,1,1,troum001,02,CCT,K,1,2,1outcount,000,0,0,1,"Mike Clevinger",0,0,Norunner,0scoring

それぞれの打席の結果などが一行に示されています。
,で区切り、4行目が打者選手のID、16行目の数字(0か1)がアウトか出塁したかを示しています。
0がアウトで1が出塁です。
犠牲フライなど出塁率に関係ない打席のデータはあらかじめ除いているのでそこは考慮しなくて大丈夫です。
これをもとに各選手ごとの出塁率を出力するというのが目的です。
出力例は下記のような感じです。

選手ID 0.310...
選手ID 0.265...
選手ID 0.288...

ソースコードは、対戦投手別の打者出塁率を出力するプログラムです。
これをどう変えれば、投手別ではなく打者の打率になりますか?
教えてもらえると助かります。

該当のソースコード

package ○○○○; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class EvaConv { public static void main(String[] args) { try { PlayerMatrix.read("ファイル名.EVA").writeTo(System.out); } catch(IOException e) { e.printStackTrace(); } } private static class PlayerMatrix { List<String> rowList = new ArrayList<>(); List<String> columnList = new ArrayList<>(); Map<String,List<Integer>> map = new HashMap<>(); // value: ヒット,アウト? void put(String row, String column, int value) { String key =makeKey(row, column); if(map.containsKey(key)) { map.get(key).add(value); } else { if(!rowList.contains(row)) rowList.add(row); if(!columnList.contains(column)) columnList.add(column); List<Integer> valueList = new ArrayList<>(); valueList.add(value); map.put(key, valueList); } } String[] getRows() { return rowList.toArray(new String[rowList.size()]); } String[] getColumns() { return columnList.toArray(new String[columnList.size()]); } // return: データが無ければ Collections.emptyList() を返す List<Integer> get(String row, String column) { List<Integer> values = map.get(makeKey(row, column)); if(values != null) return values; return Collections.emptyList(); } private String makeKey(String row, String column) { return row + "$$$" + column; } void writeTo(PrintStream out) { String[] columns = getColumns(); for(String column : columns) { out.print(","+column); } out.println(); String[] rows = getRows(); for(String row : rows) { out.print(row); for(String column : columns) { out.print(","); List<Integer> values = get(row, column); double count = 0; double hit = 0; for(int i=0; i<values.size(); i++) { if(values.get(i) == 0 || values.get(i) == 1) { count = count + 1; if(values.get(i) == 1) { hit = hit + 1; } } } if(count != 0){ out.print(hit / count); } } out.println(); } } static PlayerMatrix read(String filename) throws IOException { try(BufferedReader br = new BufferedReader(new FileReader(filename));) { PlayerMatrix matrix = new PlayerMatrix(); String line; while((line = br.readLine()) != null) { String[] tokens = line.split(","); String row = tokens[3]; //打者 String column = tokens[14]; //投手 int value = Integer.parseInt(tokens[16]); //出塁したかどうか matrix.put(row, column, value); } return matrix; } } } }

試したこと

投手の考慮せずに改良しようと思ったが、どこを変えれば良いのか分からなかった…。

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

OXYGEN.3(eclipse)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/02 07:09

開発してほしいなら、クラウドソーシング等へ行きましょう
Keita222

2020/01/02 07:16

開発ではなく、Javaに関する質問です。
m.ts10806

2020/01/02 09:02

「開発ではなく、Javaに関する質問」という返答は意味が分かりませんけど(会話が成り立ってない) 言い換えると「作業依頼なら」ですね。 現在のコードにおける問題点も具体的に記載してください。
xebme

2020/01/02 09:19

ピッチャーの名前がすべてダルビッシュだったらどうなるのかな?
Keita222

2020/01/03 07:45

コメントしてくださった方々、貴重な意見ありがとうございます! 確かに、丸投げのような形になってしまっていたことは深く反省したいと思います…。 xebmeさん、ダルビッシュ好きなんですね。 日本が誇る投手ですよね。 すいません、余談でした…。 改めて、みなさんありがとうございました!
guest

回答2

0

提案です。
既存コードからどうにかしようとするのではなく、
1からコード組みなおしてみてはどうでしょう。

既存コードがあるということは考慮しなければならない点が多く、
その分、実現したいことの本質から遠ざかる可能性もあり、技術と経験を要する作業です。
それなら、はじめから組みなおした方が着実に進めると思います。

投稿2020/01/02 12:07

m.ts10806

総合スコア80875

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

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

Keita222

2020/01/03 07:41

ありがとうございます! 確かに、1から作る方が良いですよね…。 貴重な意見ありがとうございます。
m.ts10806

2020/01/03 07:48

問題切り分けが難しくなった時の常套手段です。覚えておくと役に立ちます。 (下手にこだわると何も解決しないまま時間だけが過ぎるとかよくあるので)
Keita222

2020/01/03 10:24

なるほど…。 ありがとうございます。 覚えておきます。
guest

0

ベストアンサー

投手の名前をすべて同じにする

投手別をやめたいのだから、投手名を無名matrix.put(row, "", value);にしてください。
修正箇所は以下の(1)(2)(3)

Java

1while((line = br.readLine()) != null) { 2 String[] tokens = line.split(","); 3 String row = tokens[3]; //打者 4 //String column = tokens[14]; //投手 <---- (1) 5 int value = Integer.parseInt(tokens[16]); //出塁したかどうか 6 //matrix.put(row, column, value); <---- (2) 7 matrix.put(row, "", value); // <---- (3) 8}

""の代わりに奪三振率の高い"Yu Darvish" としたいですね。(文字列リテラルなら何でもよい)

java.util.stream.Streamを使用する統計処理(追記)

バッターの打率を集計する専用クラス。Streamを使用して作り直したソースを追記します。

Java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.io.PrintStream; 5import java.util.Map; 6import java.util.TreeMap; 7import java.util.AbstractMap.SimpleEntry; 8import java.util.stream.Collectors; 9import java.util.stream.Stream; 10 11public class EvaConv2 { 12 13 public static void main(String[] args) { 14 try { 15 PlayerMatrix.read("ファイル名.EVA").writeTo(System.out); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 } 20 21 private static class PlayerMatrix { 22 private final Map<String, Double> freqs; 23 24 public PlayerMatrix(Stream<String> lines) throws IOException { 25 freqs = lines.map( 26 line -> {String[] t = line.split(","); return new SimpleEntry<>(t[3], t[16]); 27 }).collect( 28 Collectors.groupingBy( 29 SimpleEntry::getKey, 30 TreeMap::new, 31 Collectors.averagingDouble(e -> Double.valueOf(e.getValue())) 32 )); 33 } 34 35 void writeTo(PrintStream out) { 36 out.println("player,batting average (BA)"); 37 freqs.entrySet().forEach(e -> out.printf("%s,%1.3f\n", e.getKey(), e.getValue())); 38 } 39 40 static PlayerMatrix read(String filename) throws IOException { 41 PlayerMatrix matrix = null; 42 try (BufferedReader br = new BufferedReader(new FileReader(filename))) { 43 matrix = new PlayerMatrix(br.lines()); 44 } 45 return matrix; 46 } 47 } 48}

たぶんこれよりRで作る方が簡単でしょう。

投稿2020/01/02 23:09

編集2020/01/03 16:41
xebme

総合スコア1090

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

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

Keita222

2020/01/03 07:38

返信遅くなってごめんなさい…。 ありがとうございます! Steamを使用するんですね。 助かりました! 感謝申し上げます。
xebme

2020/01/03 16:41

java.util.stream.Streamに訂正しました。
Keita222

2020/01/04 11:36

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問