使用对象阵列/对象阵列查找平均值

时间:2018-03-20 14:54:15

标签: java arrays object

这是一个如此简单的问题,但出于某种原因,我无法绕过对象阵列或对象阵列。我所要做的就是接受5个用户输入,并创建一个名为Height的类,创建对象数组并将用户输入存储到obj数组中并打印平均值。我有点卡住了。

class Height{
    int total=0;
    int count=0;
    public Height(int y) {
        total=total+y;
        count++;
    }
    public void print() {
        System.out.print("The average is: "+total/count);
    }
}

public class ObjectArray {
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.println("Enter 5 heights in inches: ");
        int[] x=new int[5];
        int total=0;
        for(int i=0;i<x.length;i++) {
            x[i]=s.nextInt();
        }
        Height[] h=new Height[x.length];
        for(int y=0;y<x.length;y++) {
            h[y]=new Height(x[y]);
        }
        h.print();
    }
}

也许我过度复杂了。现在的问题是我无法调用h.print();.我尝试了不同的迭代,例如:取出print方法并在每次迭代后进行所有打印。

4 个答案:

答案 0 :(得分:2)

你的做法是错误的。您的Height课程似乎负责评估平均值。因此,您应该将所有值放在单个Height实例中,而不是为每个用户值生成新实例。

但是,hHeight对象的数组,而print()方法是在单个Height实例上定义的。要调用此类方法,您必须访问h中包含的其中一个对象,即h[0].print()

答案 1 :(得分:0)

我假设您的目标只是打印通过用户输入收到的所有高度的平均值。

你的主要方法中的代码有点令人困惑,所以如果我在这里给出的任何例子中都错了,请纠正我。您应该,而不是创建x[]数组,只需将五个值的用户输入添加到 for循环中的Height.total并增加Height.count变量每个循环通过一个。这应该是这样的:

for (int i = 1; i <= 5; i++) {
    // System.out.println("Please enter the next height: ");
    Height.total += s.nextDouble();
    Height.count++;
}

然后,您可以运行Height.print();

我还建议添加System.out.print("");命令让用户知道他们应该输入下一个值。这是我在上面给出的示例代码中留下的评论。

答案 2 :(得分:0)

您必须以符合要求的方式设计Height

  • 每个值都需要不同的Height
  • 你需要知道有多少个实例

为此,您需要一个私有值和一个静态计数器:

class Height {

    private int value = 0;

    private static int count = 0;    // static => nb of instances

    public Height(int y) {
        value = y;
        count++;
    }

    public static int averageOf(Height... heights) {
        return Arrays.stream(heights).mapToInt(h -> h.value).sum() / count;
    }
}

要获得平均值,因为它不依赖于特定实例,您可以使用静态方法,将给定的Height的所有值相加并除以实例的nb

并使用如下:

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    int nb = 5;
    System.out.println("Enter " + nb + " heights in inches: ");

    Height[] heights = new Height[nb];
    for (int i = 0; i < heights.length; i++) {
        heights[i] = new Height(Integer.parseInt(s.nextLine()));
    }

    System.out.println("Average is " + Height.averageOf(heights));
}

答案 3 :(得分:-1)

class Height{ int total=0; int count=0; public Height(int y) { total=total+y; count++; } public void print() { System.out.print("The average is: "+total/count); } }

你看到了构造函数吗?

每次调用它都会创建一个新对象。只能在一个print()对象上调用Height

重新思考如何创建Height对象。你不需要阵列。

您可以执行以下操作,创建一个名为update的方法,用于更新类Height中的变量。 (注意:考虑重命名此类也可能是AverageHeight。)

class Height{ int total=0; int count=0; public void update(int y) { total=total+y; count++; } public void print() { System.out.print("The average is: "+total/count); } }

然后在main()

而不是:Height[] h=new Height[x.length]; for(int y=0;y<x.length;y++) { h[y]=new Height(x[y]); }

这样做:

Height h=new Height(); for(int y=0;y<x.length;y++) { h.update( x[y] ); } h.print();