在方法中检索数组的长度并不起作用

时间:2016-04-13 03:05:10

标签: java arrays dynamic-arrays

我对Java很新,所以请想象我5岁,需要一个适合五岁的答案。

首先是一些信息: 我试图制作一个动态阵列"在需要时增长和缩小。我知道arraylists,这个目的是我需要能够自己做这个并同时学习,因为我认为这是ArrayList的工作方式。

问题:我想添加一些花哨的方法,原因之一是计算整个数组的平均值。 当我试图得到长度(varible.length)所以它在其他一些方法中不起作用!

这是不起作用的方法:

public double meanValue() {
    double meanDiv = 0;
    int div = x.length;

    for (int i = 0 ; i < div ; i++) {
        meanDiv += x[i];
        System.out.println("Testing");
    }
    meanDiv = meanDiv/x.length;
    return meanDiv;
}   

它返回NaN(不是数字),但是如果你跳过除法部分它返回0,它完全没有读x.length

最糟糕的部分?有些方法正在运行,例如这个方法返回最后一个位置:

public long last() {
    long pepe = -1;
    if (x.length==0) {
        System.out.println("Nothing in the array! Returning -1");
    }
    else {
        pepe = x[x.length-1];
    }
    return pepe;
}    

我尝试了很多东西,不同的变量,而不是等等。

如果需要,全班都是:

public class dynamicArray {
    private long[] x;
    private int size = 0;

    public dynamicArray() {
        x = new long[size];
    }                                         // CREATES THE ARRAY  

    public long grab(int x) {
        if (x < this.x.length) {
            return this.x[x];
        }
        else {
            System.out.println("(GET) Out of bounds");
            return -1;
        }
    }
    public void add(long value) {
        dynamicInAction();
        x[size] = value;
        size++;
    }                                   // ADD A NUMBER TO THE ARRAY
    public void remove(int position) {

    }                              // REMOVES A SPECIFIC ARRAY POSITION----------------
    public long last() {
        long pepe = -1;
        if (x.length==0) {
            System.out.println("Nothing in the array! Returning -1");
        }
        else {
            pepe = x[x.length-1];
        }
        return pepe;
    }                                           // RETURNS THE VALUE IN THE LAST POSITION
    public long first() {
        long pepe = -1;
        if (x.length==0) {
            System.out.println("Nothing in the array! Returning -1");
        }
        else {
             pepe = x[0];
        }
        return pepe;
    }                                          // RETURNS THE VALUE IN THE FIRST POSITION
    public void modify(int position, int value) {
        if (position < x.length && position >= 0) {
            x[position] = value;
        }
        else {
            System.out.println("This position does not exist");
        }
    }                   // MODIFIES A SPECIFIC POSITION TO THE ASSIGNED VALUE
    public int size() {
        return x.length;
    }                                             // RETURNS THE CURRENT ARRAY SIZE
    public double meanValue() {
        double meanDiv = 0;
        int div = x.length;

        for (int i = 0 ; i < div ; i++) {
            meanDiv += x[i];
            System.out.println("Testing");
        }
        meanDiv = meanDiv/x.length;
        return meanDiv;
    }                                       // RETURNS THE MEAN VALUE OF THE WHOLE ARRAY-------------
    public long median() {
        return -1;
    }                                          // RETURNS THE MEDIAN VALUE OF THE WHOLE ARRAY-------------
    private void dynamicInAction() {
        if (x.length == size) {
            long[] temp = new long[x.length];
            for (int i = 0; i<x.length ; i++) {
                temp[i] = x[i];
            }
            x = null;
            //System.gc();   // Might be unnecessary
            x = new long[size+1];
            for (int i = 0; i<temp.length ; i++) {
                x[i] = temp[i];
            }
        }
    }                               // ENSURES THE ARRAY GROWS WHEN NEEDED
    public void reverse() {

    }                                         // REVERSING ALL POSITIONS IN THE ARRAY------------------
    public void clear() {                                                                                                          
       x = null;
       size = 0;
       x = new long[size];
    }                                           // CLEARS THE ARRAY



}

4 个答案:

答案 0 :(得分:0)

您正在构造函数中创建大小为0的数组。这意味着除非您将x重新分配给另一个数组,否则它将始终具有0个元素。尝试传递构造函数中的大小,如下所示:

public DynamicArray(int size){
  this.size = size;
  this.x = new long[size];
}

此外,在Java类名中每个单词都有大写字母(注意DynamicArray不是dynamicArray)。

答案 1 :(得分:0)

您的项目有效。这是你的代码

public class HelloWorld{

     public static void main(String []args){
         dynamicArray s = new dynamicArray();
         s.add(1);
         s.add(3);

        System.out.println(s.meanValue());
     }
}

结果:

2.0

因此,在调用“meanValue()”

之前,您需要添加至少1个元素

答案 2 :(得分:0)

你的班级中的那两个方法是meanValue,并且在我运行它们时最后工作正常。 这些向我展示的系统输出:

Testing
Testing
Testing
Testing
mean 3.25
last 5

我用来创建类的对象并使用它的代码。

public static void main(String ...args) {
        DynamicArray myArr = new DynamicArray();
        myArr.add(1);
        myArr.add(2);
        myArr.add(5);
        myArr.add(5);
        System.out.println("mean " + myArr.meanValue());
        System.out.println("last " + myArr.last());
    }

答案 3 :(得分:0)

以前的答案是正确的,您已将大小初始化为0。 但这不是你真正的问题。

您有两个主要问题:

1)在你的dynamicInAction中 - 你永远不会在这种方法中增加数组的大小!您只需创建一个相同大小的临时数组,将x内容复制到temp,然后将x分配给temp,从不增加大小。在创建新的临时数组时,需要稍微调整一下来增加大小。我正在预先增加&#39; size用于创建新临时数组时使用的新值:

private void dynamicInAction() {
    if (x.length == size) {
        long[] temp = new long[++size];
        for (int i = 0; i<x.length ; i++) {
            temp[i] = x[i];
        }

        //Just assign x to temp
        x = temp;

        //x = null; Unnecessary
        //System.gc();   // Unnecessary
        //Dont create another array, you already have temp..just assign it
        //x = new long[size+1];
        //for (int i = 0; i<temp.length ; i++) {
        //    x[i] = temp[i];
        //}
    }
}       

2)其次,您现在不需要在add方法中增加大小,只需设置值:

public void add(long value) {
    dynamicInAction();
    x[size-1] = value;
    //size++; Unnecessary
}