2011-06-20 3 views
2

私は文字列配列を取り、その長さによっていくつかの項目の平均を見つける方法を持っています。私はオフセットの値に応じて配列内の最初のいくつかの項目を削除するメソッドをしたいと思います。文字列の配列から最初のいくつかの項目を削除するにはどうすればよいですか?

public static double[] getMovingAverage(String[] priceList, int length, int offset){ 

    double[] newPriceList = convert(priceList); 

    int listLength = newPriceList.length; 
    int counter = 0; 
    double listsum; 
    double[] movingAverage = new double[listLength]; 

    try{ 
     for (int aa = 0; aa < listLength-1; aa++){ 
      listsum = 0; 
      for (int bb = 0; bb < length; bb++){ 
       counter = aa+bb; 

       listsum = listsum + newPriceList[counter]; 
      } 
      movingAverage[aa] = listsum/length; 
     } 
     if (offset>0){ 

         //remove first #offset# elements 

     } 
    }catch(Exception e){ 
     System.out.println(e); 
    } 
    return movingAverage; 
} 

注:convert(); String []をdouble []に​​変換します

答えて

6

配列は、Javaで固定長です。 (あなたは、配列の長さを変更することはできません。)

あなたはしかし、非常に容易に除去最初offset要素を新しい配列を作成することができます。

double[] movingAverage = { 0.1, 0.2, 1.1, 1.2 }; 
int offset = 2; 

// print before 
System.out.println(Arrays.toString(movingAverage)); 

// remove first offset elements 
movingAverage = Arrays.copyOfRange(movingAverage, offset, movingAverage.length); 

// print after 
System.out.println(Arrays.toString(movingAverage)); 

出力:

[0.1, 0.2, 1.1, 1.2] 
[1.1, 1.2] 
2

パブリック静的ダブル[] copyOfRange(ダブル[]元から INT、 intへ)の

コピー指定された範囲 指定された配列を新しい配列に挿入します。範囲の最初のインデックス(from)は で、 は0とoriginal.lengthの間にある必要があります。 です。オリジナル[from] の値は、コピーの の初期要素に配置されます(ただし、== original.lengthまたは== toからの場合を除く)。 元の配列内の次の要素の値 は、コピー内の次の要素 に配置されます。ケース0Dを指標 大きいコピーの全て 要素に格納さ たが、以上からに等しくなければならない範囲(へ)の 最終インデックス、 original.lengthより大きくてもよく、 original.length - from。返された配列の長さは です。

パラメータ:オリジナル - 範囲からコピーする からアレイ - をコピーする範囲の最初のインデックスに含め - コピーする範囲の最後のインデックス 、排他。 (このインデックスは アレイの外側に位置してもよい。)

戻り値:切り捨て又は 元の配列は、 必要な長さ

を得るためにゼロで埋め から指定された範囲を含む新しい配列 例外: は、ArrayIndexOutOfBoundsException - 元 がnullである場合に0 <から、またはから 場合> original.length() はIllegalArgumentException - - > からのNullPointerExceptionの場合: 1.6

+0

これは良い答えです。あまりにも悪い "シフトJava配列"を検索するときにそれを見つけることはありません - おそらくこのコメントは、その点で助けることができる? – lre

2

なぜ、より小さいサイズの新しいリストを出力として作成し、そのインデックスとしてindex-offsetを使用するのはなぜですか?

+0

はい。また、あなたがそれをしている間にオフセットを初期化します。 – Robin

1

配列から明示的に削除することはできませんが、ArrayListのような別のデータ構造を使用して結果を累積することができます。あなたの場合、配列を正しくサイズ変更するコードを変更したいだけかもしれません。

double[] movingAverage = new double[listLength-offset]; 

for (int aa = 0; aa < listLength-offset; aa++){ 
+0

を実行したい場合は、forループを_offset_から0ではなく開始する必要があり、最初のオフセット要素を繰り返して合計を計算する必要があります。そうしないと、実行中の平均の計算が正しく行われません – Asaf

関連する問題