【问题标题】:Printing above average times from race从比赛中打印高于平均时间
【发布时间】:2015-11-04 00:27:28
【问题描述】:

所以我试图在我的程序中打印出等于或高于平均值的时间。当我将print() 添加到我的方法本身时,它工作得很好,但是当我从我的主要方法打印它时,它会打印它应该打印的所有值,除了它打印最后一个值两次。在我收到ArrayIndexOutOfBoundsException 之前,我解决了这个问题,但显然还是有问题。我一直坚持让它工作一段时间,但无法修复它!我查看了网上和一堆论坛,并尝试实施不同的建议,但我仍然无法让它发挥作用。

如果有任何帮助或建议,我们将不胜感激。

public class MarathonRunner {

//Finding the average
public static double getAverageTime(int[] times) {
    int sum = 0;
    double average;

    for (int i = 0; i < times.length; i++) {
        sum = sum + times[i];
    }
    average = (double) sum / times.length;
    return average;

}

//Finding above Average 
public static int getAboveAverage(int[] times) {
    int aboveAverage = 0;

        for (int i = 0; i < times.length; i++) {

            if ((double)times[i] >= getAverageTime(times)) {

                aboveAverage = times[i];
                System.out.println(aboveAverage);

            }

        }

        return aboveAverage;
    }
}

测试/演示

public class TestMarathonRunner {

public static void main(String[] args) {

int times[] = { 341, 273, 278, 329, 445, 275, 275, 243, 334, 412, 
  393, 299, 343, 317, 265 };

System.out.println("The average time is: " +
     MarathonRunner.getAverageTime(times));

System.out.println(MarathonRunner.getAboveAverage(times)) ;

打印

341
329
445
334
412
393
343
The average time is: 321.46666666666664
341
329
445
334
412
393
343
343

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    当您从 main 方法打印它时,它只打印最后一次高于平均时间,这是因为那是 getAboveAverage 方法返回的内容。

    它打印所有内容然后打印最后一个两次的原因是因为您在 getAboveAverage 方法中打印所有内容,然后再次打印最后一个,因为它返回到 main 方法。

    如果您将 main 方法更改为此它应该只打印一次:

    public class TestMarathonRunner {
    
    public static void main(String[] args) {
    
    int times[] = { 341, 273, 278, 329, 445, 275, 275, 243, 334, 412, 
      393, 299, 343, 317, 265 };
    
    System.out.println("The average time is: " +
         MarathonRunner.getAverageTime(times));
    
    MarathonRunner.getAboveAverage(times);
    

    如果你想从 main 方法打印它们,你可以这样做:

    让 getAboveAverage 方法返回一个 ArrayList:

    //Finding above Average 
    public static List<Integer> getAboveAverage(int[] times) {
        List<Integer> aboveAverages = new ArrayList<Integer>();
    
            for (int i = 0; i < times.length; i++) {
    
                if ((double)times[i] >= getAverageTime(times)) {
    
                    aboveAverages.add(times[i]);
    
                }
    
            }
    
            return aboveAverages;
        }
    }
    

    然后在main方法中遍历:

    public class TestMarathonRunner {
    
    public static void main(String[] args) {
    
    int times[] = { 341, 273, 278, 329, 445, 275, 275, 243, 334, 412, 
      393, 299, 343, 317, 265 };
    
    System.out.println("The average time is: " +
         MarathonRunner.getAverageTime(times));
    
    List<Integer> aboves = MarathonRunner.getAboveAverage(times);
    for(int i : aboves){
        System.out.println(i);
    }
    

    【讨论】:

    • 哦,有道理,我认为我的方法已经设置为打印所有高于平均水平的时间,而不仅仅是最后一次,我不应该继续运行它吗?我需要让它从主打印它们全部,我将 print() 添加到方法中只是为了查看它是否有效。
    • 好的,在这种情况下,也许你可以让 getAboveAverage 返回一个数组或整数列表,其中包含所有高于平均值的时间,然后在 main 方法中遍历它们
    • 没问题,很高兴为您提供帮助 :) 你能接受我的回答吗?
    【解决方案2】:

    你的方法看起来是正确的。如果你要打印出来,不要从getAboveAverage方法返回任何东西。如果你想返回所有大于平均值的项目,那么你需要返回一个列表而不是整数.

    为避免两次打印最后一项.. 只需从您的测试中删除 System.out.println System.out.println(MarathonRunner.getAboveAverage(times)) ;

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多