Найти максимальный балл или максимальный средний балл баллов кандидатов, заданных в двухцветном массиве - PullRequest
0 голосов
/ 06 июня 2018

Вопрос. Кандидаты могут сдавать вступительные экзамены столько раз, сколько пожелают.Средняя оценка всех попыток считается в конце.Дан список баллов.найти кандидата с наивысшим баллом [средний балл].

String scores[][] = {{"Ram","155"}, 
                    {"Shyam","145"},
                    {"Ram","156"},
                    {"Balram","159"},
                    {"Balram","150"},
                    {"Ram","135"},
                    {"Mira","156"},
                    {"Mira","152"},
                    {"Shyam","155"}};

Результаты приведены в двумерном массиве, как указано выше.Нужны предложения, чтобы решить это эффективным способом.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Чтобы уменьшить сложность времени, вы можете использовать определенные коллекции:

public static String findMaxScore(String[][] scores) {
    final class Candidate implements Comparable<Candidate> {

        private final String name;
        private int scoreSum;
        private int attempts;

        public Candidate(String name) {
            this.name = name;
        }

        public void score(int score) {
            scoreSum += score;
            attempts++;
        }

        public double avg() {
            return (double)scoreSum / attempts;
        }

        @Override
        public int compareTo(Candidate candidate) {
            return Double.compare(candidate.avg(), avg());
        }
    }

    Map<String, Candidate> map = new HashMap<>();

    for (String[] data : scores) {
        map.putIfAbsent(data[0], new Candidate(data[0]));
        map.get(data[0]).score(Integer.parseInt(data[1]));
    }

    return new TreeSet<>(map.values()).iterator().next().name;
}
0 голосов
/ 08 июня 2018
public String  findmaxAverage(String[][] Grades) {
    if ( grades == null ) return "";
    Map<String,List<Integer>> map = new HashMap<>();
    for( String[] grade : Grades ) {
        List<Integer> mapList = map.get(grade[0]);
        if ( mapList == null ) mapList = new ArrayList<>();
        mapList.add(Integer.valueOf(grade[1]));
        map.put(grade[0], mapList);
    }

    double maxAverage = Double.MIN_VALUE;
    String winner = "";
    for( String name : map.nameSet()) {
        System.out.println(name+": "+map.get(name));
        List<Integer> mapList = map.get(name);
        double average = getAverage(mapList);
        if ( average > maxAverage) {
            maxAverage = average;
            winner = name;
        }

    }
    return winner; }
0 голосов
/ 06 июня 2018

В чем причина уменьшения сложности времени и пространства?Я твердо верю, что краткость и ремонтопригодность важнее производительности.

Поскольку вы отметили , я могу предложить вам следующий подход.

Map<Object, Double> scoreMap = Arrays.stream(scores)
        .collect(
            Collectors.groupingBy(i -> i[0], 
            Collectors.averagingInt(i -> Integer.parseInt(i[1])
        )));

String winner = scoreMap.entrySet().stream()
    .max(Comparator.comparingDouble(e -> e.getValue()))
    .get().getKey().toString();

Спасибо @AndyTurner за предложение параметра .max(..).

...