2

2D 配列から最初の列を取得するにはどうすればよいですか? このようなメソッドで配列を初期化しています

//Initialise the array with the values from the file
public static float[][] data(float[][] data, Scanner scan){
    int count = 0; 

    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[0].length;j++){
            count++;    
            if(count<data.length*data[0].length){
                for(int k=0;k<2; k++){

                    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                    System.out.print(data[i][j] + "  ");    
                }

            System.out.println();
            }   
        }

    }
    return data;    

}

これは私のテストファイルの内容です。(ファイルの長さは任意であることに注意してください)

13.97  2.2  
12.05  1.9  
9.99  1.5  
8.0  1.3  
6.0  0.9  
4.0  0.6  
2.0  0.3  
0.0  0.0  
-2.0  -0.3  
-4.0  -0.6  
-6.02  -0.9  
-8.0  -1.3  
-9.99  -1.6  
-12.03  -1.9  
-13.98  -2.2

端末では問題がありますが、左の列を呼び出そうとすると、右の列が取得されます。これが、右側の値だけが保存されるかどうかに関係なく発生するかどうかはわかりません。

      //should print x but actually prints y 
   public static void printX(float[][] data){

        for (int i=0;i<data.length;i++){
            for (int j=0;j<data[0].length;j++){

                System.out.println(data[i][j]);
            }
        }
    }

出力する

2.2
1.9
1.5
1.3
0.9
0.6
0.3
0.0
-0.3
-0.6
-0.9
-1.3
-1.6
-1.9
-2.2
0.0

2D配列から左側の列のデータを取得する最良の方法を誰かが明確にすることはできますか? または、この種のことを達成するための他の方法がある場合は?

4

5 に答える 5

5

IDE でデバッガーを使用し、コードをステップ実行して、何が起こっているかを正確に確認する必要があります。私への短い答えは、k = 0とk = 1の2回の読み取りデータで同じフィールドを壊しているようです。

編集

また、あなたの更新では、2番目の印刷ループでこれを探していると思います(重要ではありませんが、簡単に2になる可能性がありますが、これはIMOの方が優れています):

for (int j=0;j<data[i].length;j++){

編集ここに私があなたが明示的に欲しいと思うコードがあります:

//Only print X
public static void printX(float[][] data){

    for (int i=0;i<data.length;i++){
       System.out.println(data[i][0]);
    }
}

//Only print Y
public static void printY(float[][] data){
    for (int i=0;i<data.length;i++){
       System.out.println(data[i][1]);
    }
}

//Print both
public static void printBoth(float[][] data){
    for (int i=0;i<data.length;i++){
       System.out.println(data[i][0] + ", " + data[i][1]);
    }
}


//Print any number in array:
public static void printAll(float[][] data){
    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[i].length;j++){
            System.out.print(data[i][j];
            if (j+1 < data[i].length) {
                System.out.print(", ");
            } else {
                System.out.println();
            }
        }
    }
}

最後に、配列が正しく初期化されていないため、多くの問題が発生しています。実際には両方の値を X コンポーネントに書き込んでいるため、最初に k をループするときに X 値を i,j に書き込みます (例data[0][0])そしてそれを印刷します。2 回目に k をループすると、Y 値が同じ i,j (例: data[0][0]) に再度書き込まれ、出力されます。これは、必要な配列を出力しているように見えますが、実際には両方の値を同じ列に書き込んでいます。あなたは本当に k ループなしで何かが欲しいです:

//Initialise the array with the values from the file
public static float[][] data(float[][] data, Scanner scan){
    int count = 0; 

    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[0].length;j++){
            count++;    
            if(count<data.length*data[0].length){
                data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                System.out.print(data[i][j] + "  ");
            }    
        }
        System.out.println();
    }
    return data;    
}

k が行っていると思われる 2 つの列を強制したい場合は、次のようにします。

public static float[][] data(float[][] data, Scanner scan){
    for (int i=0;i<data.length;i++){
        for (int j=0;j<2;j++){
            data[i][j] = (float)   IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");
        }
        System.out.println();
    }
    return data;    
}

countdata.lengthすでに処理されている配列の合計サイズを制御する別の方法であるため、 / によって各列をループすることによって (または 2 番目の例では幅が 2 であることがわかっている場合は) 制限されるため、これも不要です。data[0].length

OPによって追加された編集:

私と同じことについて混乱している可能性のある人がまだ理解していない人のために明確にするために、値が保存されている場所を誤解していたので、問題を間違って設定し、短い答えはどれも意味がありませんでした。

value[here][] が最初の列の値を保持し、value[][here] が 2 番目の列の値を保持していると仮定して、全体を少し文字通りに解釈しすぎました。

なぜこれに固執したのかはわかりませんが、1D配列を(列を持つように指示する必要なく)使用していた方法と関係があると思います。

于 2013-01-24T23:04:59.610 に答える
4

あなたのコードを理解していませんが、これが役立つことを願っています:

float[][] data = new float[10][2];
// ... fill the array with data
// print 'left' column:
for (int i = 0; i < data.length; i++) {
    System.out.println(data[i][0]);
}
于 2013-01-24T23:04:40.893 に答える
3

コードのこの部分で何をしようとしていますか?

for(int k=0;k<2; k++){
    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
    System.out.print(data[i][j] + "  ");    
}

2 回書き込んdata[i][j]でいるため、返された最初の値を上書きします。

(float) IOUtil.skipToDouble(scan);

入力ファイルを見ずにコードがどうあるべきかを判断するのは難しいですが、次のようなものを探していると思います:

public static float[][] data(float[][] data, Scanner scan){
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            data[i][j] = (float) IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");    
        }
        System.out.println();
    }
    return data;
}
于 2013-02-11T16:55:33.910 に答える
1

2D 配列にデータを入れている間、配列の内容を for ループ内で 2 回上書きしていますfor(int k=0;k<2; k++)。例: i = 0 の場合を考えてみましょう:

  1. k = 0 で、データ [0][0] = 13.97
  2. k = 1 で、data[0][0] = 2.2 (13.97 を上書き) 一方、探している望ましい結果は、data[0][0] = 13.97 および data[0][1]=2.2 です。

2D 配列を埋めるには、次のコードを使用する必要があります。

public static float[][] data(float[][] data, Scanner scan){
    int count = 0; 

    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[0].length;j++){
            count++;    
            if(count<data.length*data[0].length){
                for(int k=0;k<2; k++){

                    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                    System.out.print(data[i][j] + "  ");    
                    j = j+1;
                }

            System.out.println();
            }   
        }

    }
    return data;    

}

データを読み取るための次のコード:

public static void printX(float[][] data)
{
    for (int i=0;i<data.length;i++)
    {
        System.out.println(data[i][0]);
    }
}

また、条件if(count<data.length*data[0].length)が何らかの値で失敗しiた場合、その場合は data[i][0] = 0 および data[i][1] = 0 になります。また、この事実を考慮する必要があり 0、 printX による出力の一部として期待する必要があります。

于 2013-02-11T20:59:07.307 に答える