前提・実現したいこと
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)
回答2件
あなたの回答
tips
プレビュー