За проблемы с петлей в Java-программе соревнований

1

Вот слово "слово в слово": в соревновании по дайвингу каждый счет участника рассчитывается путем снижения самого низкого и самого высокого балла, а затем добавления оставшихся баллов. Напишите программу, которая считывает предоставленный файл данных, отформатированный, как показано в следующей таблице. Для каждого дайвера выведите имя дайвера и общий балл, используя приведенные выше правила оценки. Отформатируйте общий балл каждого дайвера до двух знаков после запятой. Так, например, выход для Чэнь Руолина ниже будет: Чэнь Руолин - 56,90 балла. Ваша программа должна считывать данные из предоставленного файла данных и использовать массивы для хранения этих данных. После того, как все данные были прочитаны в программе, необходимо рассчитать каждую общую точку водолаза и вывести имя дайвера и общее количество очков. Когда суммарные суммы рассчитываются на основе правила оценки, определенного выше.

Пока у меня есть программа, которая читает файл.txt и выводит имя дайвера и список баллов. Для жизни я не могу понять, как печатать только общий балл (конечно, без высоких и самых низких баллов). Любая помощь будет принята с благодарностью, это задание дает мне головную боль!

import java.util.Vector;

public class Diver
{
private String firstName;
private String lastName;
private Vector scores;

public Diver()
{
    firstName = "";
    lastName = "";
    scores = new Vector();
}

public Diver(String firstName, String lastName, double... scores)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.scores = new Vector();

    for (double score : scores)
    {
        this.scores.add( score );
    }
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public String getLastName()
{
    return lastName;
}

public void setLastName(String lastName)
{
    this.lastName = lastName;
}



public String toString()
{
    return firstName + " " + lastName + scores.toString();
}
}

Программа TestDiver:

import java.io.*;
import java.util.*;

class TestDiver
{
    public static void main(String[] args)
    {
        try {
            Scanner scanner = new Scanner(new File("diving_data.txt"));
            scanner.useLocale(Locale.US);

            double[] scores = new double[8];

            while (scanner.hasNext())
            {
                String firstName = scanner.next();
                String lastName  = scanner.next();

                System.out.println("Diver: " + firstName + " " + lastName);

                double min = Double.MIN_VALUE;
                double max = Double.MAX_VALUE;


                for (int i = 0; i < scores.length; i++)
                {
                    scores[i] = scanner.nextDouble();

                    System.out.println(" " + scores[i]);
                }

                Diver diver = new Diver(firstName, lastName, scores);
            }
            scanner.close();
        }
        catch (Exception e)
        {
            System.out.println("Problem: " + e.getMessage());
        }
    }
}

Файл.txt: Chen Ruolin 9.2 9.3 9 9.9 9.5 9.5 9.6 9.8
Эмилия Хейманс 9,2 9,2 9 9,9 9,5 9,5 9,7 9,6
Ван Синь 9,2 9,2 9,1 9,9 9,5 9,6 9,4 9,8
Паола Эспиноса 9,2 9,3 9,2 9 9,5 9,3 9,6 9,8
Татьяна Ортис 9,2 9,3 9 9,4 9,1 9,5 9,6 9,8
Мелисса Ву 9,2 9,3 9,3 9,7 9,2 9,2 9,6 9,8
Мари-Ева Марло 9,2 9,2 9,2 9,9 9,5 9,2 9,3 9,8
Tonia Couch 9,2 9 9,1 9,5 9,2 9,3 9,4 9,6
Лаура Уилкинсон 9,7 9,1 9,3 9,4 9,5 9,4 9,6 9,2

  • 1
    Вот полезный совет: вы ничего не делаете с экземпляром Diver который создаете в цикле; это просто осталось позади. У каждого Diver есть (нетипизированный) Vector , который может помочь вам получить общий общий балл для данного конкретного дайвера.
  • 0
    @ Макота, есть ли шанс, что вы могли бы показать мне, как это сделать?
Показать ещё 2 комментария
Теги:
arrays
for-loop

3 ответа

1
Лучший ответ

Поскольку расчет баллов работает только по свойствам класса Diver, он должен быть методом класса Diver, а не быть внешним по отношению к классу. Единственная логика, которую должен содержать ваш main метод, - это ввод и вывод данных, включая форматирование. Поэтому переместите логику вычислений в класс Diver.

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

Тогда вам нужен весь ваш класс Diver. Первоначально Diver создан без оценки, а затем добавляются оценки. Это избавит вас от необходимости кэшировать данные в main методе.

Обратите внимание на то, как я использовал счетчик, поскольку я увеличиваю количество баллов с помощью Set. Я не добавляю ничего к сумме, если мы смотрим на первый элемент (counter == 0) или последний элемент (counter == scores.size() - 1).

import java.util.SortedSet;
import java.util.TreeSet;

public class Diver {
    private String firstName;
    private String lastName;
    private SortedSet<Double> scores;

    public Diver(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName  = lastName;
        scores = new TreeSet<>();
    }

    public void addScore(double score) {
        scores.add(score);
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public double getFinalScore() {
        if (scores.size() < 3) {
            return 0.0;
        }
        else {
            double sum = 0.0;
            int counter = 0;
            for(double score : scores) {
                if (counter != 0 && counter != scores.size() - 1) {
                    sum += score;
                }
                counter++;
            }
            return sum;
        }
    }
}

Если бы вы захотели, вы могли бы включить эти методы для поиска самого низкого и самого высокого балла, хотя на задание на самом деле вас не спрашивают. Посмотрите, насколько это просто, когда вы используете классы, которые JDK предоставляет вам, вместо того, чтобы пытаться написать свою собственную логику!

    public double getLowestScore() {
        return scores.first();
    }

    public double getHighestScore() {
        return scores.last();
    }

Наконец, тестовый класс. У этого есть вход, выход и форматирование. Кроме того, задание просит вас хранить все объекты Diver во время чтения входного файла, а затем выводить их после завершения чтения файла. Простейшей структурой для этого является ArrayList, потому что вы можете продолжать добавлять к нему больше объектов, не зная, сколько объектов есть для начала. Самое главное, что в тестовом классе нет логики вычисления.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class TestDiver {

    public static void main(String[] args) {
        Scanner in = new Scanner("diving_data.txt");
        List<Diver> divers = new ArrayList<>();
        while (in.hasNext()) {
            String firstName = in.next();
            String lastName  = in.next();

            Diver diver = new Diver(firstName, lastName);
            while(in.hasNextDouble()) {
                diver.addScore(in.nextDouble());
            }
            divers.add(diver);
        }
        in.close();

        for (Diver eachDiver : divers) {
            System.out.format(
                    "%s %s - %.2f points%n", 
                    eachDiver.getFirstName(), 
                    eachDiver.getLastName(), 
                    eachDiver.getFinalScore());
        }
    }
}
1

Я бы отслеживал минимум, максимум и сумму всех баллов, затем делал что-то вроде:

    while (scanner.hasNext()) {
        String firstName = scanner.next();
        String lastName = scanner.next();

        System.out.println("Diver: " + firstName + " " + lastName);

        double min = 11d; //initialize the min value to a high value
        double max = 0d; //initialize the max value with a low value
        double total = 0d; //sum all scores
        double finalScore = 0d;

        for (int i = 0; i < scores.length; i++) {
            scores[i] = scanner.nextDouble();
            if(scores[i] > max) { //if scores[i] > max, we have found a new max score
                max = scores[i];
            }
            if(scores[i] < min) { //if scores[i] < min, we have found a new min score
                min = scores[i];
            }
            total += scores[i]; //sum of all scores
            System.out.println(" " + scores[i]);
        }
        finalScore = total - max - min; //final score, sum of all scores minus min and max
        Diver diver = new Diver(firstName, lastName, finalScore, scores);
        System.out.println(diver.getFinalScoreFormatted());// final score with two decimal places
    }

Создайте переменную в классе Divers, чтобы сохранить окончательный результат, затем используйте метод getter для печати в указанном формате.

import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;
import java.util.Vector;

public class Diver {

    private String firstName;
    private String lastName;
    private Vector scores;
    private double finalScore;

    public Diver() {
        firstName = "";
        lastName = "";
        finalScore = 0;
        scores = new Vector();
    }

    public Diver(String firstName, String lastName, double finalScore, double... scores) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.scores = new Vector();
        this.finalScore = finalScore;

        for (double score : scores) {
            this.scores.add(score);
        }
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String toString() {
        return firstName + " " + lastName + scores.toString();
    }
    // getter method, method that returns the value of the instance variable finalScore
    public double getFinalScore() {
        return finalScore;
    }
    // getter method that returns the final score with two decimal places
    public String getFinalScoreFormatted() {
        DecimalFormat f = new DecimalFormat("##.00");
        return f.format(this.finalScore);
    }
}

Надеюсь, поможет.

  • 0
    Большое вам спасибо за этот полезный код? Не могли бы вы показать мне, что вы подразумеваете под методом получения, а также как вы это сделаете? Я очень смущен.
  • 0
    Я обновил пост, чтобы включить изменения. Если у вас есть какие-либо вопросы, не стесняйтесь их задавать.
Показать ещё 2 комментария
0

измените scores.length на общую переменную. потому что scores.length в этом коде scores.length возвращает 0

Внутри циклы найдите MAX и MIN.

if(scores[i]>MAX){
  MAX=scores[i];
}
if(scores[i]<MIN){
  MIN=scores[i];
}

Затем передайте MAX+MIN в класс дайвера и вычтите MAX+MIN это будет общий балл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню