2016-04-13 19 views
-1

私はかなりJavaに慣れていますので、私は5歳で、5歳に適した答えが必要です。メソッド内の配列の長さを取得できません

まず、いくつかの情報: は私が成長し、必要なときに縮む「動的配列」を作るしようとしています。私はarraylistsの知っている、これの目的は、私はこれがどのようにとにかく仕事をしていると仮定しているので、私は自分自身でこれを行うことができ、同時に学ぶ必要があるということです。

問題:私は上記の理由の1つは、配列全体の平均値を計算することですファンシーな方法を追加したいと思います。 長さ(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 



} 
+0

私にとってはうまく動作します。おそらく、テストしているデータを含め、問題を示す実行可能な例を提供する必要があります。 – MadProgrammer

+0

テストしていたとき、少なくとも1つの要素が配列に含まれていましたか? –

+0

@ImeshaSudasinghaそれは問題だった、間違って全体のリストをクリアしました。ありがとう、申し訳ありません。 – FREEDOM

答えて

0

コンストラクタでサイズが0の配列を作成しています。つまり、xを別の配列に代入しない限り、常に0の要素があります。そのように、コンストラクタでサイズを渡してみてください。

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

また、Javaでクラス名は(通知がdynamicArrayないDynamicArray)単語ごとに大文字を持っています。

+0

ありがとう、問題だった。それは大文字か一般的なものを持つ必要がありますか? – FREEDOM

+0

問題ありません。はい。すべてのJavaクラスとインタフェースには、各単語の大文字があります。変数とメソッドにはCamel-caseが使用されます。 –

+0

'private void dynamicInAction(){'のようなものでしょうか?これは 'add'によって呼び出されますか? – MadProgrammer

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 

だから、あなたが呼び出す前に、少なくとも1つの要素を追加必要 "meanValue()" あなたのクラスmeanValueと加工した最後で

0

これらの二つの方法私はそれらを実行したときにうまくいく。 それは私に示した。これらのSYSOUT:

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

前の答えはあなたが0 にサイズを初期化していることが正しいしかし、それはあなたの本当の問題ではありません。

あなたが持っている2つの主要な問題:

1)あなたのdynamicInAction - あなたには、この方法では、配列のサイズを大きくすることはありません!単に同じサイズのtemp配列を作成し、xの内容をtempにコピーし、xをtempに割り当てます。サイズを増やさないでください。新しいテンポラリ配列を作成するときにサイズを大きくするには、少し調整する必要があります。

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 
}  
+0

洞察と基本的な説明をありがとう!私はadd:x [size] = value;でエラーが発生しました。 x [size-1] = valueでなければなりません。またはそれは外に出る。 – FREEDOM

+0

私は新しい行にしようとしています。それはちょうど私の答えをすぐに投稿します。同じコメントでx = tempの質問をしていました。 x配列の正確な位置はどこですか?それは動作しますが、私は理由を理解したいです – FREEDOM

+0

あなたはx [size-1]で正しいです。私は答えでそれを修正しました。 – pczeus

関連する問題