2

いくつかの値を保持する配列と、2つの配列を受け取る関数があります。私がやりたいのは、最後の要素が配列に含まれないように配列を分割することです。そのため、2つの配列があり、1つは最後を除くすべての元の要素を持ち、もう1つは1つの要素(最後)だけを持ちます。これを関数に渡した後、元の配列を使用したいのですが、今回は最後から2番目の要素を別の配列に入れます。これを5回やりたいです。以下はそれをよりよく説明します:

int[] val = {25,50,66,75,100,1000,5000,10000,25000};

for (int i=0; i<5; i++){

//Need to split the array and then pass it to the function here
}

public void evaluate(int[] train, int[] test){

....
}

したがって、たとえば最初の反復では、配列から25000を削除/分割し、それを別の配列に配置してから、2つの配列を関数に渡します。

最初の配列は現在{25,50,66,75,100,1000,5000,10000} 、2番目の配列は{25000}

次の反復で、10000を分割/削除したいと思います(25000がアレイに戻ってきました):

したがって、最初の配列は現在{25,50,66,75,100,1000,5000,25000} 、2番目の配列は{10000}

つまり、基本的には下から上に向かって進んでいきますが、5回だけです。

4

6 に答える 6

1

前もって2つの配列を作成し、各反復後に1つの要素をテスト配列に交換します。これは、常に新しいアレイを割り当てるよりも高速です。

int[] val = {25,50,66,75,100,1000,5000,10000,25000};

// create the destination arrays:
int[] train = new int[val.length-1];
int[] test = new int[1];

// initialize the arrays:
test[0] = val[val.length-1];
for (int i = 0; i < val.length-1; ++i)
{
    train[i] = val[i];
}

int timesToIterate = 5;

for (int iteration = 0; iteration < timesToIterate; ++iteration)
{
    evaluate(train, test);

    int i = train.length-1-iteration;
    if (i >= 0) // don't swap if this is the last element in the array
    {
        int tmp = test[0];
        test[0] = train[i];
        train[i] = tmp;
    }
}

サンプルデータでは、evaluate関数に渡される配列は次のとおりです。

{25 50 66 75 100 1000 5000 10000 } {25000}
{25 50 66 75 100 1000 5000 25000 } {10000}
{25 50 66 75 100 1000 10000 25000 } {5000}
{25 50 66 75 100 5000 10000 25000 } {1000}
{25 50 66 75 1000 5000 10000 25000 } {100}
于 2013-02-25T04:37:37.920 に答える
1

ApachecommonsのArrayUtilsを使用できます。コード例は次のようになります。

    private static int[] val = { 25, 50, 66, 75, 100, 1000, 5000, 10000, 25000 };
    private static int[] test = {};

    public static void evaluate(int[] train, int[] test) {
        for (int i = 0; i < train.length; i++) {
            System.out.print(train[i] + ",");
        }
        System.out.println("");
        for (int i = 0; i < test.length; i++) {
            System.out.print(test[i] + ",");

        }
        System.out.println("");
        System.out.println("-----");
    }

    public static void main(String[] args) {

        for (int i = 0; i < 5; i++) {
            if (!ArrayUtils.isEmpty(test))
                ArrayUtils.remove(test, 0);
            evaluate(ArrayUtils.remove(val, val.length - 1 - i), ArrayUtils.add(test, val[val.length - 1 - i]));
        }
    }
于 2013-02-25T04:17:55.893 に答える
1

最も簡単な方法は、配列の使用から。の使用に切り替えることList<Integer>です。次に、このメソッドを使用してsubList、元の配列のサブシーケンスである配列を作成できます。

配列の使用を主張する場合は、次の2つのオプションがあります。

  1. 各配列引数に適用可能な範囲の開始インデックスと終了インデックスを表す引数を追加します。次に、ロジックを書き直して、(0からarray.length-1までではなく)最初から最後まで1になるようにする必要があります。
  2. 新しいアレイを割り当て、データをそれらにコピーします。配列要素を変更する場合、これは機能しません。いずれの場合も、多くの余分な作業が必要になります。

使用方法を示すコードを次に示しますList<Integer>

// autobox each value as an Integer:
List<Integer> vals = Arrays.asList(
    new Integer[] {25,50,66,75,100,1000,5000,10000,25000});
final int len = vals.length();

for (int i=0; i<5; i++){
    evaluate(vals.subList(0, i), vals.subList(i, len));
}

public void evaluate(List<Integer> train, List<Integer> test){

....
}
于 2013-02-25T00:02:32.457 に答える
1

Arrays.copyOf(..)メソッドで実行できるArraysAPIを確認してください。

newArray = Arrays.copyOf(oldArray, oldArray.length-1)

おそらく、このコードはあなたを助けることができます。

    int[] val = { 25, 50, 66, 75, 100, 1000, 5000, 10000, 25000 };
    int[] firstArray = new int[val.length-1];
    int[] SecondArray = new int[1];     
    //iterates the whole array set to 5 if needed
    for (int n = 0; n < val.length; n++) {
        SecondArray[0] = val[val.length-n-1];
        for(int x = 0, firstArrayCounter= 0; x < val.length; x++){
            if(val[x]!=SecondArray[0]){                 
                firstArray[firstArrayCounter] = val[x];
                firstArrayCounter++;
            }       
        }
        //prints what is in the arrays                      
        for (int i = 0; i < firstArray.length; i++)
            System.out.print(firstArray[i] + " ");
        System.out.println("\n"+SecondArray[0]);
    }

幸運を!

于 2013-02-25T00:04:12.100 に答える
1

最終的に何をしようとしているのかわかりませんが、これは関数型プログラミング言語に最適のようです。とにかく、Javaで、さらに配列を使ってそれを行うことができます:

1から5まで含まれるforループには、次のようなものを入れることができます。

for (int i=1; i<=5; i++){
  int[] train = new int[val.length-i];
  System.arraycopy( val, 0, train, 0, train.length-1 );
  int test = new int[1];
  test[0] = val[val.length-i];
  evaluate(train,test);
}
于 2013-02-25T00:04:22.257 に答える
1

私が使用するアルゴリズムは次のとおりです。

  1. 元の配列Aを取得し、要素が1つ少ない新しいA'と単一要素の配列を作成します。これをBと呼びます。
  2. A'にn-1個の要素を入力し、Bに1個の要素を入力します。
  3. 次に、A'とBの処理が完了したら、A'の適切な要素をB[0]と交換します。

シングルコピーはO(n)であり、5回の反復のそれぞれには、スワップを実行するための定数時間操作があります。メモリもO(n)です。

于 2013-02-25T00:04:51.123 に答える