Получите еженедельные температуры - вопрос ArrayList - PullRequest
0 голосов
/ 15 января 2020

Я новичок в любом типе компьютерного программирования / языка (пытаясь сменить профессию). Я изучаю программирование 1 в онлайн-школе, и мы используем Zybooks (что я не нашел очень полезным, поэтому я использовал другие ресурсы). Вот подсказка для домашней работы на этой неделе:

Разработайте Java программу, которая будет хранить данные в виде среднесуточных температур за одну неделю. Храните дневную и среднюю температуру в двух разных массивах. Ваша программа должна запрашивать у пользователя день недели (с понедельника по воскресенье) и отображать день и температуру для каждого дня. Если введена «неделя», выходные данные для вашей программы должны обеспечивать температуру для каждого дня и среднее значение за неделю. Используйте конструкции цикла и решения в сочетании с массивами для выполнения этого назначения.

Ниже приведен код, который у меня есть. Мне просто интересно, если 1) я на правильном пути, и 2) как распечатать свои временные характеристики, чтобы соответствовать с рабочим днем? Я думал о создании addList, но разве это не заменит дни недели временными? У меня много вопросов, и я пытаюсь найти репетитора, чтобы помочь мне. Тем временем я решил спросить это сообщество ... особенно, так как мой онлайн-учитель игнорирует все мои электронные письма и вопросы. Это весело ...

import java.util.ArrayList;

import java.util.Scanner;

public class weeklyTemps {

    public static void main(String[] args) {
        final int NUM_TEMPS = 7;
        @SuppressWarnings("resource") //not sure where this came from...figure out later

        Scanner scnr = new Scanner(System.in);
        ArrayList<String> weekDays = new ArrayList<>();
        ArrayList<Integer> weekTemps = new ArrayList<>();

        String wkDay = "";
        int averageTemp = 0;
        int sumVal = 0;
        int i = 0;

            weekDays.add("Monday");
            weekDays.add("Tuesday");
            weekDays.add("Wednesday");
            weekDays.add("Thursday");
            weekDays.add("Friday");
            weekDays.add("Saturday");
            weekDays.add("Sunday");


            weekTemps.add(75); //temps for the week
            weekTemps.add(80);
            weekTemps.add(77);
            weekTemps.add(73);
            weekTemps.add(83);
            weekTemps.add(81);
            weekTemps.add(79);


            for (i = 0; i < weekDays.size(); ++i) { 
                System.out.print("Enter the week day: ");
                wkDay = scnr.nextLine();
            }

            for (i = 0; i < weekTemps.size(); ++i) {
                //sumVal = weekTemps //figure out how to add these together later w/out writing them all out
                averageTemp = sumVal / NUM_TEMPS;
            }

            if (wkDay.equals(weekDays())) {
                System.out.print("The temperature for that day is " + weekTemps.get(0) + " degrees.");
            }
            else {
                System.out.print("The average temperature for the week is " + averageTemp + " degrees.");
            }



return;

    }

    private static Object weekDays() { //what is this...i did not write this...
        // TODO Auto-generated method stub
        return null;
    }

}

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Вы также должны добавить некоторые проверки в вашу программу, например:

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

public class WeeklyTemperature {

    public static void main(String[] args) {
        List<String> days = List.of("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "Sunday");
        List<Double> avgTemp = List.of(75.0, 80.0, 77.0, 73.0, 83.0, 81.0, 79.0);
        Scanner scanner = new Scanner(System.in);

        String day;
        int index = -1;
        do {
            System.out.print("Enter a day of the week (Monday through Sunday): ");
            day = scanner.nextLine();
            index = days.indexOf(day.toLowerCase());
            if (index == -1) {
                System.out.println("Invalid input! Try again");
            }
        } while (index == -1);

        System.out.println("Temperature on " + days.get(index) + " is: " + avgTemp.get(index));
    }
}

Пример прогона:

Enter a day of the week (Monday through Sunday): Tuesd
Invalid input! Try again
Enter a day of the week (Monday through Sunday): Tuesday
Temperature on tuesday is: 80.0

Примечание: Это не полная программа; это всего лишь руководство, как вы должны завершить остальную часть программы.

0 голосов
/ 15 января 2020

Мое решение:

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

public class Main{
    public static void main(String[] args) {
            ArrayList<Integer> dayTemps = new ArrayList<>();
            ArrayList<String> dayNames = new ArrayList<>();

            dayNames.add("Monday");
            dayNames.add("Tuesday");
            dayNames.add("Wednesday");
            dayNames.add("Thursday");
            dayNames.add("Friday");
            dayNames.add("Saturday");
            dayNames.add("Sunday");


            dayTemps.add(75); //temps for the week
            dayTemps.add(80);
            dayTemps.add(77);
            dayTemps.add(73);
            dayTemps.add(83);
            dayTemps.add(81);
            dayTemps.add(79);

            Scanner scn = new Scanner(System.in);
            System.out.println("Enter the week day: ");
            String wkDay = scn.nextLine();
            scn.close(); //It is important to close the resources we use, preventing leak

            int indexOfWeekDay = dayNames.indexOf(wkDay); //get the in index of the day
            if(indexOfWeekDay != -1){ //if the name cannot be found, -1 is returned
                //User asked us about specific weekday:
                System.out.print("The temperature for " + dayNames.get(indexOfWeekDay) +" is " + dayTemps.get(indexOfWeekDay) + " degrees.");
            }else if(wkDay.equals("week")){
                //User asked us about average:
                //Only bother calculating average if asked ;)
                float averageTemp = 0; // I would recommend float for percision
                for (Integer dayTemp : dayTemps) { //This is called an enchanted for loop. I suggest looking it up ;)
                    averageTemp += dayTemp;
                }
                averageTemp /= dayTemps.size();
                System.out.print("The average temperature for the week is " + averageTemp + " degrees.");
            }else{
                //We can't recognise the entry
                System.out.println("Wrong entry: " + wkDay);
            }
    }
}
0 голосов
/ 15 января 2020
Поскольку список упорядочен и предполагается, что умеренный индекс 0 соответствует понедельнику, вы можете сделать это;

int indexOf = weekDays.indexOf(wkDay);

int temp = weekTemps.get(indexOf);

Альтернатива 1. Проверяет DayOfWeek 2. Edge случаи и валидация 3. Использует рекурсию

public class Temps {

    private static final List<DayOfWeek> days = new ArrayList<>();

    private static final List<Integer> temperatures = new ArrayList<>();

    public static void main(String... args) {
        askUntilComplete();
    }

    private static void askUntilComplete() {
        while (days.size() < DayOfWeek.values().length) {
            ask("Enter a day of week: ");
        }
        printAverage();
    }

    private static void ask(String question) {
        Scanner scanner = new Scanner(System.in);

        System.out.println(question);

        String input = scanner.next();

        try {
            DayOfWeek dayOfWeek = DayOfWeek.valueOf(input.toUpperCase());

            System.out.println("Enter a temperature for " + dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH));

            int temperature = scanner.nextInt();

            days.add(dayOfWeek);
            temperatures.add(temperature);
        } catch (IllegalArgumentException iae) {
            System.out.println("This day does not exist.");
            ask(question);
        } catch (InputMismatchException ime) {
            System.out.println("Weekday was ok but the temperature must be an integer.");
            ask(question);
        }
    }

    private static void printAverage() {
        System.out.println("The average temperature is: " + temperatures.stream().mapToInt(v -> v).average().orElse(0));
    }

}

Альтернатива # 2 1. Использует POJO для представления дневной температуры 2. Использует контракт equals / hashcode 3. Использует Set in combo с равно / га sh, чтобы обеспечить 1 объект / день

    public static class DailyTemperatureProgram {

        private static Set<DailyTemperature> dailyTemperatures = new HashSet<>();

        private static void askUntilComplete() {
            while (dailyTemperatures.size() < DayOfWeek.values().length) {
                ask("Enter a day of week: ");
            }
            printAverage();
        }

        private static void printAverage() {
            System.out.println("The average temperature is: " + dailyTemperatures.stream()
                    .mapToInt(v -> v.temperature).average().orElse(0));
        }

        private static void ask(String question) {
            Scanner scanner = new Scanner(System.in);

            System.out.println(question);

            String input = scanner.next();

            try {
                DayOfWeek dayOfWeek = DayOfWeek.valueOf(input.toUpperCase());

                System.out.println("Enter a temperature for " + dayOfWeek.getDisplayName(TextStyle.FULL, Locale.ENGLISH));

                int temperature = scanner.nextInt();

                dailyTemperatures.add(new DailyTemperature(dayOfWeek, temperature));
            } catch (IllegalArgumentException iae) {
                System.out.println("This day does not exist.");
                ask(question);
            } catch (InputMismatchException ime) {
                System.out.println("Weekday was ok but the temperature must be an integer.");
                ask(question);
            }
        }

        private static final class DailyTemperature {

            private final DayOfWeek dayOfWeek;

            private final int temperature;

            private final int hashCode;

            private DailyTemperature(DayOfWeek dayOfWeek, int temperature) {
                this.dayOfWeek = dayOfWeek;
                this.temperature = temperature;
                this.hashCode = Objects.hash(dayOfWeek);
            }

            @Override
            public boolean equals(Object o) {
                if (o == this) {
                    return true;
                }
                if (o instanceof DailyTemperature) {
                    DailyTemperature other = (DailyTemperature) o;

                    return dayOfWeek == other.dayOfWeek;
                }
                return false;
            }
        }

    }
...