计算单个玩家的平均得分

时间:2018-08-30 02:26:13

标签: java

我要在这里达到的目的是使用玩家的唯一姓名来按个人累计所有游戏的分数,然后打印分数 通过将累积分数除以各个gameCounts得出平均值。你能帮忙吗?

package bowling_score_tracker;

import java.util.*;
import java.lang.*;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;

public class Bowling_score_tracker {

        String PlayerName;
        int gameCounts;
        int score;
        Date date;
        Bowling_score_tracker(String PlayerName, int gameCounts, int score, Date date){
            this.PlayerName=PlayerName;
            this.gameCounts=gameCounts;
            this.score=score;
            this.date=date;

        }

public static void main(String args[]) throws ParseException{

Bowling_score_tracker s1=new Bowling_score_tracker("Brown",1,98,new java.util.Date(System.currentTimeMillis()));
Bowling_score_tracker s2=new Bowling_score_tracker("Tony",1,99,new java.util.Date(System.currentTimeMillis()));
Bowling_score_tracker s3=new Bowling_score_tracker("Anne",1,100,new java.util.Date(System.currentTimeMillis()));
Bowling_score_tracker s4=new Bowling_score_tracker("Tony",2,105,new java.util.Date(System.currentTimeMillis()));
Bowling_score_tracker s5=new Bowling_score_tracker("Tony",3,106,new java.util.Date(System.currentTimeMillis()));

ArrayList<Bowling_score_tracker> al=new ArrayList<Bowling_score_tracker>();

al.add(s1);

al.add(s2);

al.add(s3);

al.add(s4);

al.add(s5);

int sum = 0;

Iterator itr=al.iterator();

while(itr.hasNext()){

我认为我需要包含一种逻辑,以按个人对所有分数求和,然后由gameCounts进行划分,但不确定如何在此处构建。

/*sum += itr.next();
average = sum / gameCounts*/

Bowling_score_tracker st=(Bowling_score_tracker)itr.next();

System.out.println(st.PlayerName+" "+st.gameCounts+" "+st.score+" "+st.date);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

java.util.Date yourDate = sdf.parse("2018-08-29");

    }
  }
}

2 个答案:

答案 0 :(得分:0)

如果您使用的是Java8,则可以轻松完成此操作,

Map<String, Double> playerToAvgScore = al.stream().collect(Collectors.groupingBy(
        Bowling_score_tracker::getPlayerName, 
        Collectors.averagingInt(Bowling_score_tracker::getScore)));

首先使用groupingBy收集器将播放器按其名称分组。每个组包含玩家参与的所有游戏。然后使用下游收集器计算每组的平均分数。您完成了!

答案 1 :(得分:0)

首先,您需要为类中的所有字段创建getter和setter方法。

然后您需要使用得分和游戏计数字段创建其他课程(现有课程之外)。

class AvgScore{
    int score1;
    int gameCount1;
    public AvgScore(int score1, int gameCount1) {
        super();
        this.score1 = score1;
        this.gameCount1 = gameCount1;
    }

    public int getScore1() {
        return score1;
    }

    public void setScore1(int score1) {
        this.score1 = score1;
    }

    public int getGameCount1() {
        return gameCount1;
    }

    public void setGameCount1(int gameCount1) {
        this.gameCount1 = gameCount1;
    }
}

然后需要创建一个存储每个玩家总得分和游戏计数的地图(此步骤在列表中添加所有元素之后写在main中)。

//Create an Map to store Player name as key and
        //its total score and game count as vale
        Map<String, AvgScore> avgScore=new HashMap<>();
        for(Bowling_score_tracker bl:al){
            if(avgScore.containsKey(bl.getPlayerName())){
                AvgScore sc=avgScore.get(bl.getPlayerName());
                int scr=bl.getScore()+sc.getScore1();
                int gc=bl.getGameCounts()+sc.getGameCount1();
                avgScore.put(bl.getPlayerName(),new AvgScore(scr,gc));
            }
            else{
                avgScore.put(bl.getPlayerName(), new AvgScore(bl.getScore(), bl.getGameCounts()));
            }
        }

接下来的步骤将存储每个玩家的总得分和游戏计数。 然后需要计算每个玩家的平均值。

//Calculate Average socre.
        for(Map.Entry<String, AvgScore> map:avgScore.entrySet()){
            AvgScore sc=map.getValue();
            double avg=((double)sc.getScore1()/sc.getGameCount1());
            System.out.println("Name: "+map.getKey()+"  Avg.= "+avg);
        }

这将计算每个球员的平均得分。

希望对您有帮助。