Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在方法中检索数组的长度不会';行不通_Java_Arrays_Dynamic Arrays - Fatal编程技术网

Java 在方法中检索数组的长度不会';行不通

Java 在方法中检索数组的长度不会';行不通,java,arrays,dynamic-arrays,Java,Arrays,Dynamic Arrays,我对Java相当陌生,所以请想象我5岁,需要一个适合5岁孩子的答案 首先是一些信息: 我正在尝试制作一个“动态数组”,在需要时可以增减。我知道ArrayList,其目的是我需要能够自己做这件事,同时也要学习,因为我假设这就是ArrayLists的工作方式 问题:我想添加一些奇特的方法,原因之一是计算整个数组的平均值。 当我尝试获取长度(variable.length)时,它不起作用,而在其他一些方法中它起作用 这是一种不起作用的方法: public double meanValue() {

我对Java相当陌生,所以请想象我5岁,需要一个适合5岁孩子的答案

首先是一些信息: 我正在尝试制作一个“动态数组”,在需要时可以增减。我知道ArrayList,其目的是我需要能够自己做这件事,同时也要学习,因为我假设这就是
ArrayList
s的工作方式

问题:我想添加一些奇特的方法,原因之一是计算整个数组的平均值。 当我尝试获取长度(
variable.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;
}   
我尝试了太多的事情,不同种类的变量,而不是for,等等

如果需要的话,这是整个课程:

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



}
公共类动态卡雷{
私人长[]x;
私有整数大小=0;
公共图书馆{
x=新长[尺寸];
}//创建数组
公共长抓斗(int x){
如果(x<此.x.长度){
返回此.x[x];
}
否则{
System.out.println(“(GET)out-bounds”);
返回-1;
}
}
公共无效添加(长值){
dynamicAction();
x[尺寸]=数值;
大小++;
}//向数组中添加一个数字
公共无效删除(内部位置){
}//删除特定的数组位置----------------
公众长片(){
长pepe=-1;
如果(x.length==0){
System.out.println(“数组中没有任何内容!返回-1”);
}
否则{
pepe=x[x.length-1];
}
返回pepe;
}//返回最后一个位置的值
公共长优先(){
长pepe=-1;
如果(x.length==0){
System.out.println(“数组中没有任何内容!返回-1”);
}
否则{
pepe=x[0];
}
返回pepe;
}//返回第一个位置的值
公共无效修改(int位置,int值){
如果(位置=0){
x[位置]=值;
}
否则{
System.out.println(“此位置不存在”);
}
}//将特定位置修改为指定值
公共整数大小(){
返回x.length;
}//返回当前数组大小
公共双平均值(){
双平均数=0;
int div=x.length;
对于(int i=0;i对于(int i=0;i您正在构造函数中创建一个大小为0的数组。这意味着,除非您将x重新分配给另一个数组,否则它将始终具有0个元素。请尝试在构造函数中传递大小,如下所示:

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

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

您的项目可以正常工作。下面是您的代码

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个元素。

在您的类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());
    }

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

您有两个主要问题:

(一)在您的
dynamicAction
-此方法中,您永远不会增加数组的大小!您只需创建一个大小相同的临时数组,将x内容复制到临时数组,然后将x分配给临时数组,永远不会增加大小。在创建新临时数组时,您需要稍微调整以增加大小。我正在“预增加”大小以使创建新临时数组时使用的新值:

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

对我来说效果很好。也许你应该提供一个可运行的示例来说明你的问题,包括你在测试时测试的数据,它们在数组中是否至少有一个元素?@ImeshaSudasingha这就是问题所在,意外地清除了整个列表。谢谢,对不起。谢谢,是问题所在。必须有上限吗大小写还是一般的东西?没问题。是的,所有Java类和接口的每个单词都有大写字母。Camel大小写用于变量和方法。类似于
private void dynamicAction(){
maybe?它由
add
调用?dynamicAction()方法不起作用,因为for循环中的循环继续条件基于数组的原始大小,即0,因此它们不会运行。感谢您的深入了解和基本解释!虽然add:x[size]=value;必须是x[size-1],但我还是遇到了一个错误=value;或itd出界。天哪,我想换一行,它只是直接发布了我的答案。我试图在同一条评论中询问x=temp;是如何工作的,x数组的增加在哪里?虽然它工作,但我想知道为什么你在x[size-1]上是正确的。我在答案中更正了它。你创建了一个新的long[]调用temp,将所有值从x复制到新的temp[]。调用x=temp只是将x“点”到temp。所有变量都是es
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];
        //}
    }
}       
public void add(long value) {
    dynamicInAction();
    x[size-1] = value;
    //size++; Unnecessary
}