【问题标题】:Get Weekly Temperatures - ArrayList question获取每周温度 - ArrayList 问题
【发布时间】:2020-05-01 16:58:20
【问题描述】:

我是任何类型的计算机编程/语言的全新初学者(尝试转行)。我正在通过在线学校学习编程 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;
    }

}

【问题讨论】:

    标签: java string arraylist int


    【解决方案1】:

    我的解决方案:

    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);
                }
        }
    }
    

    【讨论】:

    • 非常感谢您的回复!如果可以的话,我有几个问题。首先,我可以在程序结束时关闭扫描仪吗?就像一直在底部?还是放置计数?另外,您为什么选择将 Scanner 移到 .add 部分之后?为什么我要使用 indexOf() 操作?我肯定会查找一个迷人的 for 循环,因为到目前为止我们只学到了 while、do-while 和 for 循环。你认为既然我还没有学习魔法循环,我应该坚持一个常规循环吗?是超高级的java吗?无论如何,再次感谢您的帮助!
    【解决方案2】:
    1. 由于列表是有序的,并且假设索引 0 处的温度对应于星期一,您可以这样做;
    
    int indexOf = weekDays.indexOf(wkDay);
    
    int temp = weekTemps.get(indexOf);
    

    替代方案 1. 检查 DayOfWeek 2. 边缘案例和验证 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 与 equals/hash 组合使用以确保 1 obj/day

        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;
                }
            }
    
        }
    

    【讨论】:

    • 非常感谢您的回复!我有一个非常愚蠢的问题,但我真的不认为我们已经在课堂上讨论过这个......公共和私人静态无效有什么区别?我选择使用什么重要吗?到目前为止,我们只使用了 public。还有,“抓”是什么意思?最后一个问题......什么是“HashSet”?再次感谢您的帮助!
    • 嘿@Katelyn,这根本不是一个愚蠢的问题。公共意味着该方法可以在任何地方访问,而私有意味着该方法只能在类中访问。
    • 两部分答案,太长了。当您不想或不需要向类外部公开方法时,私有很有用。 Catch 是 try-catch 语句的重要补丁。当抛出 Throwable 对象时调用 try-catch 语句。 HashSet 是 Set 的一种实现,特别适用于实现 equals/hashcode 协定的对象。这是因为直到大多数其他集合的查找时间为 O(N),因为哈希码我们知道索引,所以查找时间为 O(1)。
    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 2012-09-03
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多