2015-08-21 4 views
1

Файл имеет различные имена команд, а в другом файле есть места для матчей. Я пытаюсь написать фрагмент кода, который находит среднюю посещаемость для каждой команды.как вычислить среднее значение для моего кода

я хотел бы, чтобы выглядеть подобно этому

public static double mean(double[] m) { 
    double sum = 0; 
    for (int i = 0; i < m.length; i++) { 
     sum += m[i]; 
    } 
    return sum/m.length; 
} 

Я попытался решить это сам, и вот что я придумал. Я пытаюсь объединить два списка вместе.

public static String getAverageAttendance(Team team) 
{ 
    ArrayList<Match> ourList = new ArrayList(results); 



    ArrayList<Match> teamsAttendance = new ArrayList<Match>(); 
    for (Match att : ourList) 
    { 
     if (att != null && att.getTeamName().equals(team.getName())) 
     { 
      teamsAttendance.add(att); 
     } 
    } 



    float crowd = 0; 
    for (Match att : teamsAttendance) 
    { 
    float multiplier = (att.getAttendance()/391); 
    crowd = crowd + multiplier 

    } 
} 

Я понимаю, что код, вероятно, нуждается в повторном использовании, и я не думаю, что правильно использовал float. Как вы можете видеть, я новичок, и любая помощь будет высоко оценена.

+3

Что такое волшебный номер '391'? Разве вы не должны выполнять команду 'crowd/teamsAttendance.size()' после того, как вы добавите все посещаемости? –

+1

Получаете ли вы неправильный ответ при запуске своего кода, или вы не можете завершить программу, чтобы получить среднее значение? –

ответ

0

Вы могли бы сделать что-то вроде этого:

public static String getAverageAttendance(Team team) { 

    double[] attendences = new doble[result.size()]; 
    for (int i = 0; i < result.size(); i++) { 
     Match att = results.get(i); 
     if (att != null && att.getTeamName().equals(team.getName())){ 
      attendences[i] = getAdjustedAttendence(att); 
     } 
    } 

    return mean(attendences); 
} 

public double getAdjustedAttendence(Match match) { 
    //whatever you do to adjust the numbers 
} 

Не забудьте сделать проверку в среднем() ошибка, из-за прохождения в нуль массива приведет его выбросить исключение.

1

Я исхожу из предположения, что results является static List<Match>. С этим предположением, я полагаю, вы могли бы создать свою функцию следующим образом:

public static String getAverageAttendance(Team team) { 
    double totalCrowds = 0.0; 
    int totalMatches = 0; 
    for (Match match : results) { 
     if (match.getTeamName().equals(team.getName())) { 
      totalCrowds += match.getAttendance(); 
      totalMatches++; 
     } 
    } 
    double averageAttendance = totalMatches > 0 ? totalCrowds/totalMatches : 0.0; 
    return String.valueOf(averageAttendance); 
} 

Это устраняет необходимость создания дополнительных списков и только перебирает матчей один раз. Я выбрал double, но вы можете так же легко использовать float, если вы предпочитаете этот тип.

Если вы используете Java 8 и хотите использовать потоки:

public static String getAverageAttendance(Team team) { 
    return String.valueOf(results 
      .stream() 
      .filter(m -> m.getTeamName().equals(team.getName())) 
      .collect(Collectors.averagingDouble(Match::getAttendance))); 
} 

Вы, возможно, потребуется изменить averagingDouble к averagingInt или какой-либо соответствующей функции в зависимости от вашего числового типа возвращаемого Match::getAttendance.

Обратите внимание, что обе эти функции соответствуют вашей оригинальной сигнатуре метода и возвращают String. Если у вас есть контроль над этим методом, я бы предложил вернуть числовой тип double или float и позволить вызывающему преобразовать его в String, если это необходимо. Я также рекомендовал бы передать объект List<Match> в качестве параметра для метода вместо зависимости от переменной static, так как это сделает метод более пригодным для повторного использования, но я не знаю всех ваших вариантов использования.

Смежные вопросы