【问题标题】:array lists in java: exclude the first element from `for` loopjava中的数组列表:从`for`循环中排除第一个元素
【发布时间】:2016-08-09 14:09:02
【问题描述】:

我正在介绍 Java 编程类,并且我有一个数组列表,我需要在其中排除我的 for 循环中找到平均值的第一个元素。数组列表中的第一个元素是平均值的权重(这就是需要排除它的原因)。我还需要从数组列表的其余部分中删除最小值,因此我的第二个 for 循环。我已尝试创建列表的副本,也尝试创建子列表,但无法使其正常工作。

public static double Avgerage(ArrayList<Double> inputValues) {
    double avg;
    double sum = 0;
    double weightValue = inputValues.get(0);
    double lowest = inputValues.get(0);

    for (int i = 1; i > inputValues.size(); i++) {
        if (inputValues.get(i) < lowest) {
            lowest = inputValues.get(i);
        }
    }
    for (int i = 0; i < inputValues.size(); i++) {
        sum = sum + inputValues.get(i);
    }
    double average = (sum - lowest) / (inputValues.size() - 1);

    avg = average * weightValue;

    return avg;
}

【问题讨论】:

    标签: arraylist methods


    【解决方案1】:

    要从良好的编程实践开始,您应该尽可能使用接口而不是类。这里合适的接口是List&lt;Double&gt;,当你在你的类中创建它时,你应该使用

    List<Double> nameOfList = new ArrayList<Double>();
    

    我们正在做的是创建一个具有 List 行为的对象,以及 ArrayList 的底层实现(更多信息here

    关于这个问题,您似乎并没有像您所说的那样排除第一个元素 - 两个 for 循环都遍历列表中的所有值。请记住将 ArrayList 视为数组 - 访问元素不会修改它,就像它可能在队列中一样。

    我在下面编辑了您的代码来演示这一点,还包括了一些其他优化并更正了第 7 行的符号错误:

    public static double average(List<Double> inputValues) {
        double sum = 0;
    
        //Exclude the first element, as it contains the weight
        double lowest = inputValues.get(1);
        for (int i = 2; i < inputValues.size(); i++) {
            lowest = Math.min(inputValues.get(i), lowest);
        }
    
        for (int i = 1; i < inputValues.size(); i++) {
            sum += inputValues.get(i);
        }
    
        double average = (sum - lowest) / (inputValues.size() - 1);
    
        //Scale by the weight
        avg *= inputValues.get(0);
    
        return avg;
    }
    

    注意:java中的约定是使用camelCase作为方法名,我做了相应的调整。

    另外,我不知道您的要求,但最佳情况下,您应该提供合乎逻辑的参数。如果可能,请在调用函数之前执行以下操作:

    int weight = inputValues.get(0);
    inputValues.remove(0);
    //And then you would call like this, and update your method signature to match
    average(inputValues, weight);
    

    我不在方法内部这样做,因为上下文暗示我们不会修改值。

    【讨论】:

    • 不幸的是,分配要求我使用数组列表。话虽这么说,如果我以您给我的代码为例,它不应该至少删除除第一个元素之外的下一个最低数字吗?我试了几次,它仍然只删除第一个元素。
    • 你确定吗?最低应该是最小的数字,不包括第一个元素,并且在计算平均值时从总和中减去。
    • 这段代码仍然可以使用 ArrayList 实现,它也对其他选项开放。如果分配在函数签名中特别需要 ArrayList,那么就使用它,它在功能上是相同的,但希望你能尽快介绍接口,以免强化不好的做法!
    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多